]>
Commit | Line | Data |
---|---|---|
e6e7bf38 | 1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3 | -- GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS -- | |
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 -- | |
8 | -- -- | |
9dfe12ae | 9 | -- Copyright (C) 1991-1994, Florida State University -- |
10 | -- Copyright (C) 1995-2003, Ada Core Technologies -- | |
e6e7bf38 | 11 | -- -- |
12 | -- GNARL is free software; you can redistribute it and/or modify it under -- | |
13 | -- terms of the GNU General Public License as published by the Free Soft- -- | |
14 | -- ware Foundation; either version 2, or (at your option) any later ver- -- | |
15 | -- sion. GNARL is distributed in the hope that it will be useful, but WITH- -- | |
16 | -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- | |
17 | -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- | |
18 | -- for more details. You should have received a copy of the GNU General -- | |
19 | -- Public License distributed with GNARL; see file COPYING. If not, write -- | |
20 | -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- | |
21 | -- MA 02111-1307, USA. -- | |
22 | -- -- | |
23 | -- As a special exception, if other files instantiate generics from this -- | |
24 | -- unit, or you link this unit with other files to produce an executable, -- | |
25 | -- this unit does not by itself cause the resulting executable to be -- | |
26 | -- covered by the GNU General Public License. This exception does not -- | |
27 | -- however invalidate any other reasons why the executable file might be -- | |
28 | -- covered by the GNU Public License. -- | |
29 | -- -- | |
9dfe12ae | 30 | -- GNARL was developed by the GNARL team at Florida State University. -- |
31 | -- Extensive contributions were provided by Ada Core Technologies, Inc. -- | |
e6e7bf38 | 32 | -- -- |
33 | ------------------------------------------------------------------------------ | |
34 | ||
35 | -- This is an OS/2 version of this package. | |
36 | ||
37 | -- This package provides low-level support for most tasking features. | |
38 | ||
39 | pragma Polling (Off); | |
40 | -- Turn off polling, we do not want ATC polling to take place during | |
41 | -- tasking operations. It causes infinite loops and other problems. | |
42 | ||
43 | with Interfaces.OS2Lib.Threads; | |
44 | with Interfaces.OS2Lib.Synchronization; | |
45 | ||
46 | package System.Task_Primitives is | |
47 | ||
48 | pragma Preelaborate; | |
49 | ||
50 | -- type Lock is limited private; | |
51 | -- Should be used for implementation of protected objects. | |
52 | ||
53 | -- type RTS_Lock is limited private; | |
54 | -- Should be used inside the runtime system. | |
55 | -- The difference between Lock and the RTS_Lock is that the later | |
56 | -- one serves only as a semaphore so that do not check for | |
57 | -- ceiling violations. | |
58 | ||
59 | type Task_Body_Access is access procedure; | |
60 | -- Pointer to the task body's entry point (or possibly a wrapper | |
61 | -- declared local to the GNARL). | |
62 | ||
63 | -- type Private_Data is limited private; | |
64 | -- Any information that the GNULLI needs maintained on a per-task | |
65 | -- basis. A component of this type is guaranteed to be included | |
66 | -- in the Ada_Task_Control_Block. | |
67 | ||
68 | -- private | |
69 | ||
f15731c4 | 70 | type Lock is record |
71 | Mutex : aliased Interfaces.OS2Lib.Synchronization.HMTX; | |
72 | Priority : Integer; | |
73 | Owner_Priority : Integer; | |
74 | Owner_ID : Address; | |
75 | end record; | |
e6e7bf38 | 76 | |
77 | type RTS_Lock is new Lock; | |
78 | ||
79 | type Private_Data is record | |
80 | Thread : aliased Interfaces.OS2Lib.Threads.TID; | |
81 | pragma Atomic (Thread); | |
82 | -- Thread field may be updated by two different threads of control. | |
83 | -- (See, Enter_Task and Create_Task in s-taprop.adb). | |
84 | -- They put the same value (thr_self value). We do not want to | |
85 | -- use lock on those operations and the only thing we have to | |
86 | -- make sure is that they are updated in atomic fashion. | |
87 | ||
88 | CV : aliased Interfaces.OS2Lib.Synchronization.HEV; | |
89 | ||
90 | L : aliased RTS_Lock; | |
91 | -- Protection for all components is lock L | |
92 | ||
93 | Current_Priority : Integer := -1; | |
94 | -- The Current_Priority is the actual priority of a thread. | |
95 | -- This field is needed because it is only possible to set a | |
96 | -- delta priority in OS/2. The only places where this field should | |
97 | -- be set are Set_Priority, Create_Task and Initialize (Environment). | |
98 | ||
99 | Wrapper : Interfaces.OS2Lib.Threads.PFNTHREAD; | |
100 | -- This is the original wrapper passed by Operations.Create_Task. | |
101 | -- When installing an exception handler in a thread, the thread | |
102 | -- starts executing the Exception_Wrapper which calls Wrapper | |
103 | -- when the handler has been installed. The handler is removed when | |
104 | -- wrapper returns. | |
105 | end record; | |
106 | ||
107 | end System.Task_Primitives; |