]>
Commit | Line | Data |
---|---|---|
e6e7bf38 | 1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
96d7aa32 | 3 | -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- |
e6e7bf38 | 4 | -- -- |
5 | -- S Y S T E M . T A S K _ P R I M I T I V E S -- | |
6 | -- -- | |
7 | -- S p e c -- | |
e6e7bf38 | 8 | -- -- |
6e2e029f | 9 | -- Copyright (C) 1992-2017, Free Software Foundation, Inc. -- |
e6e7bf38 | 10 | -- -- |
11 | -- GNARL is free software; you can redistribute it and/or modify it under -- | |
12 | -- terms of the GNU General Public License as published by the Free Soft- -- | |
6bc9506f | 13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
14 | -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- | |
e6e7bf38 | 15 | -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- |
6bc9506f | 16 | -- or FITNESS FOR A PARTICULAR PURPOSE. -- |
17 | -- -- | |
18 | -- As a special exception under Section 7 of GPL version 3, you are granted -- | |
19 | -- additional permissions described in the GCC Runtime Library Exception, -- | |
20 | -- version 3.1, as published by the Free Software Foundation. -- | |
21 | -- -- | |
22 | -- You should have received a copy of the GNU General Public License and -- | |
23 | -- a copy of the GCC Runtime Library Exception along with this program; -- | |
24 | -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- | |
25 | -- <http://www.gnu.org/licenses/>. -- | |
e6e7bf38 | 26 | -- -- |
e78e8c8e | 27 | -- GNARL was developed by the GNARL team at Florida State University. -- |
9dfe12ae | 28 | -- Extensive contributions were provided by Ada Core Technologies, Inc. -- |
e6e7bf38 | 29 | -- -- |
30 | ------------------------------------------------------------------------------ | |
31 | ||
3d875462 | 32 | -- This is a Solaris version of this package |
e6e7bf38 | 33 | |
96d7aa32 | 34 | -- This package provides low-level support for most tasking features |
e6e7bf38 | 35 | |
36 | pragma Polling (Off); | |
35e3878c | 37 | -- Turn off polling, we do not want ATC polling to take place during tasking |
38 | -- operations. It causes infinite loops and other problems. | |
e6e7bf38 | 39 | |
f163f79e | 40 | with Ada.Unchecked_Conversion; |
3d875462 | 41 | |
35e3878c | 42 | with System.OS_Interface; |
43 | ||
e6e7bf38 | 44 | package System.Task_Primitives is |
45 | pragma Preelaborate; | |
46 | ||
47 | type Lock is limited private; | |
48 | type Lock_Ptr is access all Lock; | |
3d875462 | 49 | -- Should be used for implementation of protected objects |
e6e7bf38 | 50 | |
51 | type RTS_Lock is limited private; | |
52 | type RTS_Lock_Ptr is access all RTS_Lock; | |
96d7aa32 | 53 | -- Should be used inside the runtime system. The difference between Lock |
54 | -- and the RTS_Lock is that the later one serves only as a semaphore so | |
55 | -- that do not check for ceiling violations. | |
e6e7bf38 | 56 | |
f163f79e | 57 | function To_Lock_Ptr is |
58 | new Ada.Unchecked_Conversion (RTS_Lock_Ptr, Lock_Ptr); | |
3d875462 | 59 | |
96d7aa32 | 60 | type Suspension_Object is limited private; |
61 | -- Should be used for the implementation of Ada.Synchronous_Task_Control | |
62 | ||
e6e7bf38 | 63 | type Task_Body_Access is access procedure; |
64 | -- Pointer to the task body's entry point (or possibly a wrapper | |
65 | -- declared local to the GNARL). | |
66 | ||
67 | type Private_Data is limited private; | |
96d7aa32 | 68 | -- Any information that the GNULLI needs maintained on a per-task basis. |
69 | -- A component of this type is guaranteed to be included in the | |
70 | -- Ada_Task_Control_Block. | |
e6e7bf38 | 71 | |
0244eba9 | 72 | subtype Task_Address is System.Address; |
0244eba9 | 73 | Task_Address_Size : constant := Standard'Address_Size; |
e9b26a1d | 74 | -- Type used for task addresses and its size |
0244eba9 | 75 | |
76 | Alternate_Stack_Size : constant := 0; | |
77 | -- No alternate signal stack is used on this platform | |
78 | ||
e6e7bf38 | 79 | private |
80 | ||
5e1428a8 | 81 | type Private_Task_Serial_Number is mod 2 ** Long_Long_Integer'Size; |
96d7aa32 | 82 | -- Used to give each task a unique serial number |
e6e7bf38 | 83 | |
84 | type Base_Lock is new System.OS_Interface.mutex_t; | |
85 | ||
86 | type Owner_Int is new Integer; | |
87 | for Owner_Int'Alignment use Standard'Maximum_Alignment; | |
88 | ||
89 | type Owner_ID is access all Owner_Int; | |
90 | ||
3d875462 | 91 | function To_Owner_ID is |
f163f79e | 92 | new Ada.Unchecked_Conversion (System.Address, Owner_ID); |
3d875462 | 93 | |
e6e7bf38 | 94 | type Lock is record |
3d875462 | 95 | L : aliased Base_Lock; |
96 | Ceiling : System.Any_Priority := System.Any_Priority'First; | |
ab8a61d0 | 97 | Saved_Priority : System.Any_Priority := System.Any_Priority'First; |
3d875462 | 98 | Owner : Owner_ID; |
99 | Next : Lock_Ptr; | |
100 | Level : Private_Task_Serial_Number := 0; | |
101 | Buddy : Owner_ID; | |
102 | Frozen : Boolean := False; | |
e6e7bf38 | 103 | end record; |
104 | ||
105 | type RTS_Lock is new Lock; | |
106 | ||
96d7aa32 | 107 | type Suspension_Object is record |
108 | State : Boolean; | |
109 | pragma Atomic (State); | |
110 | -- Boolean that indicates whether the object is open. This field is | |
111 | -- marked Atomic to ensure that we can read its value without locking | |
112 | -- the access to the Suspension_Object. | |
113 | ||
114 | Waiting : Boolean; | |
115 | -- Flag showing if there is a task already suspended on this object | |
116 | ||
117 | L : aliased System.OS_Interface.mutex_t; | |
118 | -- Protection for ensuring mutual exclusion on the Suspension_Object | |
119 | ||
120 | CV : aliased System.OS_Interface.cond_t; | |
121 | -- Condition variable used to queue threads until condition is signaled | |
122 | end record; | |
123 | ||
124 | -- Note that task support on gdb relies on the fact that the first two | |
125 | -- fields of Private_Data are Thread and LWP. | |
e6e7bf38 | 126 | |
a7d3dd30 | 127 | type Private_Data is limited record |
96d7aa32 | 128 | Thread : aliased System.OS_Interface.thread_t; |
e6e7bf38 | 129 | pragma Atomic (Thread); |
130 | -- Thread field may be updated by two different threads of control. | |
96d7aa32 | 131 | -- (See, Enter_Task and Create_Task in s-taprop.adb). They put the same |
132 | -- value (thr_self value). We do not want to use lock on those | |
133 | -- operations and the only thing we have to make sure is that they are | |
134 | -- updated in atomic fashion. | |
e6e7bf38 | 135 | |
136 | LWP : System.OS_Interface.lwpid_t; | |
96d7aa32 | 137 | -- The LWP id of the thread. Set by self in Enter_Task |
e6e7bf38 | 138 | |
3d875462 | 139 | CV : aliased System.OS_Interface.cond_t; |
140 | L : aliased RTS_Lock; | |
141 | -- Protection for all components is lock L | |
e6e7bf38 | 142 | |
143 | Active_Priority : System.Any_Priority := System.Any_Priority'First; | |
96d7aa32 | 144 | -- Simulated active priority, used iff Priority_Ceiling_Support is True |
e6e7bf38 | 145 | |
146 | Locking : Lock_Ptr; | |
3d875462 | 147 | Locks : Lock_Ptr; |
e6e7bf38 | 148 | Wakeups : Natural := 0; |
149 | end record; | |
150 | ||
151 | end System.Task_Primitives; |