OSDN Git Service

2009-08-08 Laurent GUERBY <laurent@guerby.net>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / ada / acats / tests / c9 / c94008c.ada
1 -- C94008C.ADA
2
3 --                             Grant of Unlimited Rights
4 --
5 --     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
6 --     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
7 --     unlimited rights in the software and documentation contained herein.
8 --     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
9 --     this public release, the Government intends to confer upon all 
10 --     recipients unlimited rights  equal to those held by the Government.  
11 --     These rights include rights to use, duplicate, release or disclose the 
12 --     released technical data and computer software in whole or in part, in 
13 --     any manner and for any purpose whatsoever, and to have or permit others 
14 --     to do so.
15 --
16 --                                    DISCLAIMER
17 --
18 --     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
19 --     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
20 --     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
21 --     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
22 --     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
23 --     PARTICULAR PURPOSE OF SAID MATERIAL.
24 --*
25 -- CHECK THAT SELECT WITH TERMINATE ALTERNATIVE WORKS CORRECTLY WITH
26 -- NESTED TASKS.
27
28 -- THIS TEST CONTAINS RACE CONDITIONS AND USES A GENERIC INSTANCE THAT
29 -- CONTAINS TASKS.
30
31 -- JEAN-PIERRE ROSEN 24 FEBRUARY 1984
32 -- JRK 4/7/86
33 -- JBG 8/29/86 ELIMINATED SHARED VARIABLES; ADDED GENERIC UNIT
34 -- PWN 11/30/94 REMOVED PRAGMA PRIORITY INSTANCES FOR ADA 9X.
35
36 with Impdef;
37 WITH REPORT; USE REPORT;
38 WITH SYSTEM; USE SYSTEM;
39 PROCEDURE C94008C IS
40
41
42 -- GENERIC UNIT FOR DOING UPDATES OF SHARED VARIABLES
43      GENERIC
44           TYPE HOLDER_TYPE IS PRIVATE;
45           TYPE VALUE_TYPE IS PRIVATE;
46           INITIAL_VALUE : HOLDER_TYPE;
47           WITH PROCEDURE SET (HOLDER : OUT HOLDER_TYPE;
48                               VALUE  : IN  HOLDER_TYPE) IS <>;
49           WITH PROCEDURE UPDATE (HOLDER : IN OUT HOLDER_TYPE;
50                                  VALUE  : IN  VALUE_TYPE) IS <>;
51      PACKAGE SHARED IS
52           PROCEDURE SET (VALUE : IN HOLDER_TYPE);
53           PROCEDURE UPDATE (VALUE : IN VALUE_TYPE);
54           FUNCTION GET RETURN HOLDER_TYPE;
55      END SHARED;
56
57      PACKAGE BODY SHARED IS
58           TASK SHARE IS
59                ENTRY SET    (VALUE : IN HOLDER_TYPE);
60                ENTRY UPDATE (VALUE : IN VALUE_TYPE);
61                ENTRY READ   (VALUE : OUT HOLDER_TYPE);
62           END SHARE;
63
64           TASK BODY SHARE IS
65                VARIABLE : HOLDER_TYPE;
66           BEGIN
67                LOOP
68                     SELECT
69                          ACCEPT SET (VALUE : IN HOLDER_TYPE) DO
70                               SHARED.SET (VARIABLE, VALUE);
71                          END SET;
72                     OR
73                          ACCEPT UPDATE (VALUE : IN VALUE_TYPE) DO
74                               SHARED.UPDATE (VARIABLE, VALUE);
75                          END UPDATE;
76                     OR
77                          ACCEPT READ (VALUE : OUT HOLDER_TYPE) DO
78                               VALUE := VARIABLE;
79                          END READ;
80                     OR
81                          TERMINATE;
82                     END SELECT;
83                END LOOP;
84           END SHARE;
85
86           PROCEDURE SET (VALUE : IN HOLDER_TYPE) IS
87           BEGIN
88                SHARE.SET (VALUE);
89           END SET;
90
91           PROCEDURE UPDATE (VALUE : IN VALUE_TYPE) IS
92           BEGIN
93                SHARE.UPDATE (VALUE);
94           END UPDATE;
95
96           FUNCTION GET RETURN HOLDER_TYPE IS
97                VALUE : HOLDER_TYPE;
98           BEGIN
99                SHARE.READ (VALUE);
100                RETURN VALUE;
101           END GET;
102
103      BEGIN
104           SHARE.SET (INITIAL_VALUE);    -- SET INITIAL VALUE
105      END SHARED;
106
107      PACKAGE EVENTS IS
108
109           TYPE EVENT_TYPE IS
110                RECORD
111                     TRACE  : STRING (1..4) := "....";
112                     LENGTH : NATURAL := 0;
113                END RECORD;
114
115           PROCEDURE UPDATE (VAR : IN OUT EVENT_TYPE; VAL : CHARACTER);
116           PROCEDURE SET (VAR : OUT EVENT_TYPE; VAL : EVENT_TYPE);
117      END EVENTS;
118
119      PACKAGE COUNTER IS
120           PROCEDURE UPDATE (VAR : IN OUT INTEGER; VAL : INTEGER);
121           PROCEDURE SET (VAR : OUT INTEGER; VAL : INTEGER);
122      END COUNTER;
123
124      PACKAGE BODY COUNTER IS
125           PROCEDURE UPDATE (VAR : IN OUT INTEGER; VAL : INTEGER) IS
126           BEGIN
127                VAR := VAR + VAL;
128           END UPDATE;
129
130           PROCEDURE SET (VAR : OUT INTEGER; VAL : INTEGER) IS
131           BEGIN
132                VAR := VAL;
133           END SET;
134      END COUNTER;
135
136      PACKAGE BODY EVENTS IS
137           PROCEDURE UPDATE (VAR : IN OUT EVENT_TYPE; VAL : CHARACTER) IS
138           BEGIN
139                VAR.LENGTH := VAR.LENGTH + 1;
140                VAR.TRACE(VAR.LENGTH) := VAL;
141           END UPDATE;
142
143           PROCEDURE SET (VAR : OUT EVENT_TYPE; VAL : EVENT_TYPE) IS
144           BEGIN
145                VAR := VAL;
146           END SET;
147
148      END EVENTS;
149
150      USE EVENTS, COUNTER;
151
152      PACKAGE TRACE IS NEW SHARED (EVENT_TYPE, CHARACTER, ("....", 0));
153      PACKAGE TERMINATE_COUNT IS NEW SHARED (INTEGER, INTEGER, 0);
154
155      FUNCTION ENTER_TERMINATE RETURN BOOLEAN IS
156      BEGIN
157           TERMINATE_COUNT.UPDATE (1);
158           RETURN TRUE;
159      END ENTER_TERMINATE;
160
161 BEGIN -- C94008C
162
163      TEST ("C94008C", "CHECK CORRECT OPERATION OF SELECT WITH " &
164                       "TERMINATE ALTERNATIVE");
165
166      DECLARE
167
168           PROCEDURE EVENT (VAR : CHARACTER) RENAMES TRACE.UPDATE;
169
170           TASK T1 IS
171                ENTRY E1;
172           END T1;
173
174           TASK BODY T1 IS
175
176                TASK T2 IS
177                     ENTRY E2;
178                END T2;
179
180                TASK BODY T2 IS
181
182                     TASK T3 IS
183                          ENTRY E3;
184                     END T3;
185
186                     TASK BODY T3 IS
187                     BEGIN
188                          SELECT
189                               ACCEPT E3;
190                          OR WHEN ENTER_TERMINATE => TERMINATE;
191                          END SELECT;
192                          EVENT ('D');
193                     END T3;
194
195                BEGIN -- T2
196
197                     SELECT
198                          ACCEPT E2;
199                     OR WHEN ENTER_TERMINATE => TERMINATE;
200                     END SELECT;
201
202                     DELAY 10.0 * Impdef.One_Second;
203
204                     IF TERMINATE_COUNT.GET /= 1 THEN
205                          DELAY 20.0 * Impdef.One_Long_Second;
206                     END IF;
207
208                     IF TERMINATE_COUNT.GET /= 1 THEN
209                          FAILED ("30 SECOND DELAY NOT ENOUGH - 1 ");
210                     END IF;
211
212                     EVENT ('C');
213                     T1.E1;
214                     T3.E3;
215                END T2;
216
217           BEGIN -- T1;
218
219                SELECT
220                     ACCEPT E1;
221                OR WHEN ENTER_TERMINATE => TERMINATE;
222                END SELECT;
223
224                EVENT ('B');
225                TERMINATE_COUNT.SET (0);
226                T2.E2;
227
228                SELECT
229                     ACCEPT E1;
230                OR WHEN ENTER_TERMINATE => TERMINATE;
231                END SELECT;
232
233                SELECT
234                     ACCEPT E1;
235                OR TERMINATE;  -- ONLY THIS ONE EVER CHOSEN.
236                END SELECT;
237
238                FAILED ("TERMINATE NOT SELECTED IN T1");
239           END T1;
240
241      BEGIN
242
243           DELAY 10.0 * Impdef.One_Second; -- WAIT FOR T1, T2, AND T3 TO GET TO SELECT STMTS.
244
245            IF TERMINATE_COUNT.GET /= 3 THEN
246                 DELAY 20.0 * Impdef.One_Long_Second;
247            END IF;
248
249            IF TERMINATE_COUNT.GET /= 3 THEN
250                 FAILED ("30 SECOND DELAY NOT ENOUGH - 2");
251            END IF;
252
253           EVENT ('A');
254           T1.E1;
255
256      EXCEPTION
257           WHEN OTHERS => FAILED ("EXCEPTION IN MAIN BLOCK");
258      END;
259
260      IF TRACE.GET.TRACE /= "ABCD" THEN
261           FAILED ("INCORRECT ORDER OF EVENTS: " & TRACE.GET.TRACE);
262      END IF;
263
264      RESULT;
265 END C94008C;