diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2017-09-11 11:18:42 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2017-09-11 11:18:42 +0200 |
commit | 2b9d0dc00b4d77713e85f02476ef920af3b5f763 (patch) | |
tree | 200ef8d0d3baa118ca962281419cbdcd4c1db3ac /gcc/ada/libgnarl/s-tpopsp__vxworks.adb | |
parent | 635c99aaf7250ef13dbd7a6f02141cb735bdcc2f (diff) | |
download | gcc-2b9d0dc00b4d77713e85f02476ef920af3b5f763.zip gcc-2b9d0dc00b4d77713e85f02476ef920af3b5f763.tar.gz gcc-2b9d0dc00b4d77713e85f02476ef920af3b5f763.tar.bz2 |
libgnarl: Rename ?-[a-z]*-* into ?-[a-z]*__*
2017-09-11 Jerome Lambourg <lambourg@adacore.com>
* libgnarl: Rename ?-[a-z]*-* into ?-[a-z]*__*
* gcc-interface/Makefile.in: Take this renaming into account.
From-SVN: r251965
Diffstat (limited to 'gcc/ada/libgnarl/s-tpopsp__vxworks.adb')
-rw-r--r-- | gcc/ada/libgnarl/s-tpopsp__vxworks.adb | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gcc/ada/libgnarl/s-tpopsp__vxworks.adb b/gcc/ada/libgnarl/s-tpopsp__vxworks.adb new file mode 100644 index 0000000..bc343b1 --- /dev/null +++ b/gcc/ada/libgnarl/s-tpopsp__vxworks.adb @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- SYSTEM.TASK_PRIMITIVES.OPERATIONS.SPECIFIC -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 1992-2017, 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- -- +-- ware Foundation; either version 3, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. -- +-- -- +-- As a special exception under Section 7 of GPL version 3, you are granted -- +-- additional permissions described in the GCC Runtime Library Exception, -- +-- version 3.1, as published by the Free Software Foundation. -- +-- -- +-- You should have received a copy of the GNU General Public License and -- +-- a copy of the GCC Runtime Library Exception along with this program; -- +-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- +-- <http://www.gnu.org/licenses/>. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. -- +-- Extensive contributions were provided by Ada Core Technologies, Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- This is a VxWorks version of this package where foreign threads are +-- recognized. The implementation is based on VxWorks taskVarLib. + +separate (System.Task_Primitives.Operations) +package body Specific is + + ATCB_Key : aliased System.Address := System.Null_Address; + -- Key used to find the Ada Task_Id associated with a thread + + ATCB_Key_Addr : System.Address := ATCB_Key'Address; + pragma Export (Ada, ATCB_Key_Addr, "__gnat_ATCB_key_addr"); + -- Exported to support the temporary AE653 task registration + -- implementation. This mechanism is used to minimize impact on other + -- targets. + + Stack_Limit : aliased System.Address; + + pragma Import (C, Stack_Limit, "__gnat_stack_limit"); + + type Set_Stack_Limit_Proc_Acc is access procedure; + pragma Convention (C, Set_Stack_Limit_Proc_Acc); + + Set_Stack_Limit_Hook : Set_Stack_Limit_Proc_Acc; + pragma Import (C, Set_Stack_Limit_Hook, "__gnat_set_stack_limit_hook"); + -- Procedure to be called when a task is created to set stack limit if + -- limit checking is used. + + ---------------- + -- Initialize -- + ---------------- + + procedure Initialize is + begin + null; + end Initialize; + + ------------------- + -- Is_Valid_Task -- + ------------------- + + function Is_Valid_Task return Boolean is + begin + return taskVarGet (taskIdSelf, ATCB_Key'Access) /= ERROR; + end Is_Valid_Task; + + --------- + -- Set -- + --------- + + procedure Set (Self_Id : Task_Id) is + Result : STATUS; + + begin + -- If argument is null, destroy task specific data, to make API + -- consistent with other platforms, and thus compatible with the + -- shared version of s-tpoaal.adb. + + if Self_Id = null then + Result := taskVarDelete (taskIdSelf, ATCB_Key'Access); + pragma Assert (Result /= ERROR); + return; + end if; + + if not Is_Valid_Task then + Result := taskVarAdd (Self_Id.Common.LL.Thread, ATCB_Key'Access); + pragma Assert (Result = OK); + + if Stack_Check_Limits + and then Result /= ERROR + and then Set_Stack_Limit_Hook /= null + then + -- This will be initialized from taskInfoGet() once the task is + -- is running. + + Result := + taskVarAdd (Self_Id.Common.LL.Thread, Stack_Limit'Access); + pragma Assert (Result /= ERROR); + end if; + end if; + + Result := + taskVarSet + (Self_Id.Common.LL.Thread, + ATCB_Key'Access, + To_Address (Self_Id)); + pragma Assert (Result /= ERROR); + end Set; + + ---------- + -- Self -- + ---------- + + function Self return Task_Id is + begin + return To_Task_Id (ATCB_Key); + end Self; + +end Specific; |