1-- C93005C.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 IF AN EXCEPTION IS RAISED IN A DECLARATIVE PART OR PACKAGE
26-- SPECIFICATION, A TASK DECLARED IN THE SAME DECLARATIVE PART BECOMES
27-- COMPLETED BEFORE IT HAS BEEN ACTIVATED; ANY TASKS AWAITING A
28-- RENDEZVOUS WITH THE COMPLETED RECEIVE TASKING_ERROR.
29
30-- CASE 1: TASKS IN DECLARATIVE PART OF A BLOCK AND PACKAGE
31-- SPECIFICATION.  THE TASKS DEPEND ON THE DECLARATIVE PART.
32
33-- RAC 19-MAR-1985
34-- JBG 06/03/85
35-- EG  10/30/85  ELIMINATE THE USE OF NUMERIC_ERROR IN TEST.
36-- PWN 09/11/94  REMOVED PRAGMA PRIORITY FOR ADA 9X.
37
38WITH REPORT; USE REPORT;
39WITH SYSTEM; USE SYSTEM;
40PRAGMA ELABORATE (REPORT);
41
42with Impdef;
43
44PACKAGE C93005C_PK1 IS
45
46     -- THIS TYPE OF TASK IS ALWAYS UNACTIVATED.
47     TASK TYPE UNACTIVATED IS
48          ENTRY E;
49     END UNACTIVATED;
50
51     TYPE ACC_UNACTIVATED IS ACCESS UNACTIVATED;
52
53     -- *******************************************
54     -- DEFINITIONS FOR MUST NOT BE TERMINATED TASKS
55     -- *******************************************
56     --
57     -- THIS SET OF DECLARATIONS DEFINES A RECORD TYPE MNT (MUST NOT
58     -- TERMINATE).  WHENEVER SUCH A RECORD IS DECLARED, A COUNT IS
59     -- INCREMENTED AND A TASK IS CREATED.   THE TASK WILL DECREMENT THE
60     -- COUNT UNLESS IT IS INCORRECTLY AND PREMATURELY TERMINATED.
61     -- THE ROUTINE CHECK IS CALLED TO VERIFY WHETHER THE COUNT
62     -- HAS RETURNED TO 0 (ALL MNT TASKS GOT A CHANCE TO DO THEIR
63     -- DECREMENT).
64
65     -- AN MNT TASK.   SUCH TASKS MUST NOT BE TERMINATED
66     -- BY ANYONE BUT THEMSELVES.
67     --
68     TASK TYPE MNT_TASK IS
69     END MNT_TASK;
70
71     FUNCTION F RETURN INTEGER;
72
73     -- THE RECORD THAT IS DECLARED TO HOLD AN MNT TASK
74     -- AND FORCE CALLING F BEFORE CREATING THE TASK.
75     -- F INCREMENTS THE COUNT, THE TASK DECREMENTS THE
76     -- COUNT.
77     --
78     TYPE MNT IS
79          RECORD
80               DUMMY : INTEGER :=  F;
81               T     : MNT_TASK;
82          END RECORD;
83
84     PROCEDURE CHECK;
85
86
87     -- *******************************************
88     -- END OF DEFINITIONS FOR MUST NOT BE TERMINATED TASKS
89     -- *******************************************
90
91END C93005C_PK1;
92
93
94PACKAGE BODY C93005C_PK1 IS
95
96-- THIS TASK IS CALLED IF AN UNACTIVATED TASK
97-- IS EVER INCORRECTLY ACTIVATED.  IT REPORTS FAILURE.
98
99     TASK T IS
100          ENTRY E;
101     END;
102
103     -- ***********************************************
104     -- START OF DEFINITIONS FOR MUST NOT TERMINATE TASKS
105     -- ***********************************************
106
107-- COUNT OF TASKS THAT MUST NOT BE TERMINATED AND
108-- ARE STILL ACTIVE.
109
110     MNT_COUNT : INTEGER := 0;
111
112-- TASK TO SYNCHRONIZE THE MNT_COUNT VARIABLE
113
114     TASK MNT_COUNTER IS
115          ENTRY INCR;
116          ENTRY DECR;
117     END MNT_COUNTER;
118
119-- SYNCHRONIZING TASK
120
121     TASK BODY MNT_COUNTER IS
122     BEGIN
123          LOOP
124               SELECT
125                    ACCEPT INCR DO
126                         MNT_COUNT := MNT_COUNT +1;
127                    END INCR;
128
129               OR  ACCEPT DECR DO
130                         MNT_COUNT := MNT_COUNT -1;
131                    END DECR;
132
133               OR  TERMINATE;
134
135               END SELECT;
136          END LOOP;
137     END MNT_COUNTER;
138
139-- INCREMENT THE MNT_COUNT WHEN A TASK IS CREATED
140--
141     FUNCTION F RETURN INTEGER IS
142     BEGIN
143          MNT_COUNTER.INCR;
144          RETURN 0;
145     END F;
146
147-- CHECK THAT THE MUST NOT BE TERMINATED TASKS ARE
148-- NOT YET TERMINATED AND THAT THE SYNCRHONIZING TASK
149-- ITSELF IS NOT TERMINATED.
150--
151     PROCEDURE CHECK IS
152     BEGIN
153          IF MNT_COUNT /= 0 OR MNT_COUNTER'TERMINATED THEN
154               FAILED ("SOME MUST-NOT-TERMINATE TASK WAS PREMATURELY " &
155                       "TERMINATED");
156          END IF;
157-- RESET THE COUNT FOR THE NEXT SUBTEST:
158          MNT_COUNT := 0;
159     END CHECK;
160
161-- A MUST NOT BE TERMINATED TASK.  DELAY LONG ENOUGH
162-- TO BE THE LAST TASK OF A SCOPE TO TERMINATE.   THEN
163-- DECREMENT THE COUNTER.
164--
165     TASK BODY MNT_TASK IS
166     BEGIN
167          DELAY 5.0 * Impdef.One_Second;
168          MNT_COUNTER.DECR;
169     END MNT_TASK;
170
171     -- ***********************************************
172     -- END OF DEFINITIONS FOR MUST NOT TERMINATE TASKS
173     -- ***********************************************
174
175     TASK BODY T IS
176     BEGIN
177          LOOP
178               SELECT
179                    ACCEPT E DO
180                         FAILED ("SOME TYPE U TASK WAS ACTIVATED");
181                    END E;
182
183               OR   TERMINATE;
184               END SELECT;
185          END LOOP;
186     END T;
187
188     -- TASKS OF TYPE UNACTIVATED MUST NEVER BE ACTIVATED.
189     --
190     TASK BODY UNACTIVATED IS
191     BEGIN
192          T.E;
193     END UNACTIVATED;
194END C93005C_PK1;
195
196WITH REPORT, C93005C_PK1;
197USE  REPORT, C93005C_PK1;
198WITH SYSTEM; USE SYSTEM;
199PROCEDURE C93005C IS
200
201
202BEGIN
203
204     TEST("C93005C", "TEST EXCEPTIONS TERMINATE NOT YET ACTIVATED " &
205                     "TASKS");
206
207     COMMENT("SUBTEST 1: TASKS IN DECL PART OF A BLOCK AND A PACKAGE " &
208             "SPEC");
209     COMMENT("  THE TASKS DEPEND ON THE DECLARATIVE PART");
210B1:  DECLARE
211          X : MNT;
212     BEGIN
213B2:       BEGIN
214B3:            DECLARE
215                    TYPE ACC_MNT IS ACCESS MNT;
216                    T1 : UNACTIVATED;
217                    M2 : ACC_MNT := NEW MNT;
218
219                    PACKAGE RAISES_EXCEPTION IS
220                         T2 : UNACTIVATED;
221                         M3 : ACC_MNT := NEW MNT;
222                         I  : POSITIVE := IDENT_INT(0); -- RAISE
223                                          -- CONSTRAINT_ERROR EXCEPTION
224                    END RAISES_EXCEPTION;
225                    USE RAISES_EXCEPTION;
226               BEGIN  -- WOULD HAVE BEEN ACTIVATED HERE
227                    IF EQUAL (I, I) THEN
228                         FAILED ("EXCEPTION NOT RAISED");
229                    END IF;
230               EXCEPTION
231                    WHEN OTHERS =>
232                         FAILED ("EXCEPTION RAISED IN WRONG SCOPE");
233               END B3;
234          EXCEPTION
235               WHEN CONSTRAINT_ERROR =>
236                    COMMENT ("SUBTEST 1 COMPLETED");
237               WHEN OTHERS =>
238                    FAILED ("WRONG EXCEPTION RAISED IN B2");
239          END B2;
240     END B1;
241
242     CHECK;
243
244     RESULT;
245
246EXCEPTION
247     WHEN OTHERS =>
248          FAILED ("EXCEPTION NOT ABSORBED");
249          RESULT;
250END C93005C;
251