[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