[Ada] fix task support for vxworks 6 rtp in debugger
Arnaud Charlet
charlet@adacore.com
Tue Oct 31 19:37:00 GMT 2006
Tested on i686-linux, committed on trunk.
Ada task support in the debugger was not working with RTPs on VxWorks 6. It
was because task Ids stored in the Ada Task Control Block (ATCB) are different
from task Ids reported by external tools (e.g. windsh and the debugger).
Object Ids, including task Ids, are actually opaque "handles" on the user side,
which means that a task Id on the user side does not correspond to the task Id
of this task on the kernel side. These handles do not directly correspond to
the Ids used on the kernel (which are actually addresses).
This problem has been fixed by means of storing task Ids used by the kernel in
a different field within the ATCB (called LWP); this is the field that will be
later retrieved by the debugger.
2006-10-31 Jose Ruiz <ruiz@adacore.com>
* s-osinte-vxworks.ads, s-osinte-vxworks.adb:
(getpid): New body for this function that uses the underlying taskIdSelf
function for VxWorks 5 and VxWorks 6 in kernel mode.
(unsigned_int): New type, modular to allow logical bit operations.
(taskOptionsGet): New imported function.
* s-taspri-vxworks.ads (Private_Data): Change the type for the LWP
field to be compliant with the type used by the corresponding operating
system primitive.
-------------- next part --------------
Index: s-osinte-vxworks.ads
===================================================================
--- s-osinte-vxworks.ads (revision 118179)
+++ s-osinte-vxworks.ads (working copy)
@@ -48,6 +48,7 @@ package System.OS_Interface is
subtype int is Interfaces.C.int;
subtype short is Short_Integer;
+ type unsigned_int is mod 2 ** int'Size;
type long is new Long_Integer;
type unsigned_long is mod 2 ** long'Size;
type size_t is mod 2 ** Standard'Address_Size;
@@ -154,8 +155,7 @@ package System.OS_Interface is
pragma Inline (kill);
function getpid return t_id;
- pragma Import (C, getpid, "taskIdSelf");
- -- VxWorks doesn't have getpid; taskIdSelf is the equivalent routine.
+ pragma Inline (getpid);
----------
-- Time --
@@ -218,6 +218,9 @@ package System.OS_Interface is
function taskIdSelf return t_id;
pragma Import (C, taskIdSelf, "taskIdSelf");
+ function taskOptionsGet (tid : t_id; pOptions : access int) return int;
+ pragma Import (C, taskOptionsGet, "taskOptionsGet");
+
function taskSuspend (tid : t_id) return int;
pragma Import (C, taskSuspend, "taskSuspend");
Index: s-osinte-vxworks.adb
===================================================================
--- s-osinte-vxworks.adb (revision 118179)
+++ s-osinte-vxworks.adb (working copy)
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1997-2005 Free Software Foundation --
+-- Copyright (C) 1997-2006 Free Software Foundation --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -47,6 +47,18 @@ package body System.OS_Interface is
Low_Priority : constant := 255;
-- VxWorks native (default) lowest scheduling priority.
+ ------------
+ -- getpid --
+ ------------
+
+ function getpid return t_id is
+ begin
+ -- VxWorks 5 (and VxWorks 6 in kernel mode) does not have a getpid
+ -- function. taskIdSelf is the equivalent routine.
+
+ return taskIdSelf;
+ end getpid;
+
----------
-- kill --
----------
Index: s-taspri-vxworks.ads
===================================================================
--- s-taspri-vxworks.ads (revision 118179)
+++ s-taspri-vxworks.ads (working copy)
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2006 Free Software Foundation, Inc. --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -102,7 +102,7 @@ private
-- use lock on those operations and the only thing we have to
-- make sure is that they are updated in atomic fashion.
- LWP : aliased System.Address;
+ LWP : aliased System.OS_Interface.t_id := 0;
-- The purpose of this field is to provide a better tasking support on
-- gdb. The order of the two first fields (Thread and LWP) is important.
-- On targets where lwp is not relevant, this is equivalent to Thread.
More information about the Gcc-patches
mailing list