Merge from mainline
[official-gcc.git] / gcc / testsuite / ada / acats / tests / c9 / c954026.a
blob9e261247bcb2450ed07978606da2ee8835d48160
1 -- C954026.A
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.
16 -- DISCLAIMER
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 --*
26 -- OBJECTIVE:
27 -- Check that if the original protected entry call was a conditional
28 -- entry call, the call is cancelled if a requeue-with-abort of the
29 -- call is not selected immediately.
30 -- Check that if the original protected entry call was a timed entry
31 -- call, the expiration time for a requeue-with-abort is the original
32 -- expiration time.
34 -- TEST DESCRIPTION:
35 -- In this test the main task makes a variety of calls to the protected
36 -- object Initial_PO. These calls include a simple call, a conditional
37 -- call, and a timed call. The timed calls include calls with enough
38 -- time and those with less than the needed amount of time to get through
39 -- the requeue performed by Initial_PO.
40 -- Initial_PO requeues its entry call to Final_PO.
41 -- Final_PO does not accept the requeued call until the protected
42 -- procedure Ok_To_Take_Requeue is called.
43 -- A separate task, Delayed_Opener, is used to call Ok_To_Take_Requeue
44 -- after a delay amount specified by the main task has expired.
47 -- CHANGE HISTORY:
48 -- 15 DEC 95 SAIC ACVC 2.1
49 -- 10 JUL 96 SAIC Incorporated reviewer comments.
50 -- 10 OCT 96 SAIC Incorporated fix provided by vendor.
52 --!
54 with Calendar;
55 use type Calendar.Time;
56 with Report;
57 with Impdef;
58 procedure C954026 is
59 Verbose : constant Boolean := False;
60 Final_Po_Reached : Boolean := False;
61 Allowed_Time : constant Duration := 2.0 * Impdef.One_Long_Second;
62 Plenty_Of_Time : constant Duration :=
63 Allowed_Time + Impdef.Clear_Ready_Queue + 1.0 * Impdef.One_Long_Second;
64 Not_Enough_Time : constant Duration := Allowed_Time - 0.5 * Impdef.One_Long_Second;
65 begin
66 Report.Test ("C954026",
67 "Check that if the original entry" &
68 " call was a conditional or timed entry call," &
69 " the expiration time for a requeue with" &
70 " abort to a protected" &
71 " entry is the original expiration time");
72 declare
74 protected Initial_Po is
75 entry Start_Here;
76 end Initial_Po;
78 protected Final_Po is
79 entry Requeue_Target;
80 procedure Ok_To_Take_Requeue;
81 procedure Close_Requeue;
82 private
83 Open : Boolean := False;
84 end Final_Po;
86 -- the Delayed_Opener task is used to notify Final_PO that it can
87 -- accept the Requeue_Target entry.
88 task Delayed_Opener is
89 entry Start_Timer (Amt : Duration);
90 entry Cancel_Timer;
91 end Delayed_Opener;
93 task body Delayed_Opener is
94 Wait_Amt : Duration;
95 begin
96 loop
97 accept Start_Timer (Amt : Duration) do
98 Wait_Amt := Amt;
99 end Start_Timer;
100 exit when Wait_Amt < 0.0;
101 if Verbose then
102 Report.Comment ("Timer started");
103 end if;
104 select
105 accept Cancel_Timer do
106 Final_Po.Close_Requeue;
107 end Cancel_Timer;
109 delay Wait_Amt;
110 Final_Po.Ok_To_Take_Requeue;
111 accept Cancel_Timer do
112 Final_Po.Close_Requeue;
113 end Cancel_Timer;
114 end select;
115 end loop;
116 exception
117 when others =>
118 Report.Failed ("exception in Delayed_Opener");
119 end Delayed_Opener;
121 protected body Initial_Po is
122 entry Start_Here when True is
123 begin
124 Final_Po_Reached := False;
125 requeue Final_Po.Requeue_Target with abort;
126 end Start_Here;
127 end Initial_Po;
129 protected body Final_Po is
130 entry Requeue_Target when Open is
131 begin
132 Open := False;
133 Final_Po_Reached := True;
134 end Requeue_Target;
136 procedure Ok_To_Take_Requeue is
137 begin
138 Open := True;
139 end Ok_To_Take_Requeue;
141 procedure Close_Requeue is
142 begin
143 Open := False;
144 end Close_Requeue;
145 end Final_Po;
147 begin -- test encapsulation
148 -- unconditional entry call to check the simple case
149 Delayed_Opener.Start_Timer (0.0);
150 Initial_Po.Start_Here;
151 if Final_Po_Reached then
152 if Verbose then
153 Report.Comment ("simple case passed");
154 end if;
155 else
156 Report.Failed ("simple case");
157 end if;
158 Delayed_Opener.Cancel_Timer;
161 -- timed but with plenty of time - delay relative
162 Delayed_Opener.Start_Timer (Allowed_Time);
163 select
164 Initial_Po.Start_Here;
166 delay Plenty_Of_Time;
167 Report.Failed ("plenty of time timed out (1)");
168 if Final_Po_Reached then
169 Report.Failed (
170 "plenty of time timed out after accept (1)");
171 end if;
172 end select;
173 if Final_Po_Reached then
174 if Verbose then
175 Report.Comment ("plenty of time case passed (1)");
176 end if;
177 else
178 Report.Failed ("plenty of time (1)");
179 end if;
180 Delayed_Opener.Cancel_Timer;
183 -- timed but with plenty of time -- delay until
184 Delayed_Opener.Start_Timer (Allowed_Time);
185 select
186 Initial_Po.Start_Here;
188 delay until Calendar.Clock + Plenty_Of_Time;
189 Report.Failed ("plenty of time timed out (2)");
190 if Final_Po_Reached then
191 Report.Failed (
192 "plenty of time timed out after accept(2)");
193 end if;
194 end select;
195 if Final_Po_Reached then
196 if Verbose then
197 Report.Comment ("plenty of time case passed (2)");
198 end if;
199 else
200 Report.Failed ("plenty of time (2)");
201 end if;
202 Delayed_Opener.Cancel_Timer;
205 -- timed without enough time - delay relative
206 Delayed_Opener.Start_Timer (Allowed_Time);
207 select
208 Initial_Po.Start_Here;
209 Report.Failed ("not enough time completed accept (1)");
211 delay Not_Enough_Time;
212 end select;
213 if Final_Po_Reached then
214 Report.Failed ("not enough time (1)");
215 else
216 if Verbose then
217 Report.Comment ("not enough time case passed (1)");
218 end if;
219 end if;
220 Delayed_Opener.Cancel_Timer;
223 -- timed without enough time - delay until
224 Delayed_Opener.Start_Timer (Allowed_Time);
225 select
226 Initial_Po.Start_Here;
227 Report.Failed ("not enough time completed accept (2)");
229 delay until Calendar.Clock + Not_Enough_Time;
230 end select;
231 if Final_Po_Reached then
232 Report.Failed ("not enough time (2)");
233 else
234 if Verbose then
235 Report.Comment ("not enough time case passed (2)");
236 end if;
237 end if;
238 Delayed_Opener.Cancel_Timer;
241 -- conditional case
242 Delayed_Opener.Start_Timer (Allowed_Time);
243 select
244 Initial_Po.Start_Here;
245 Report.Failed ("no time completed accept");
246 else
247 if Verbose then
248 Report.Comment ("conditional case - else taken");
249 end if;
250 end select;
251 if Final_Po_Reached then
252 Report.Failed ("no time");
253 else
254 if Verbose then
255 Report.Comment ("no time case passed");
256 end if;
257 end if;
258 Delayed_Opener.Cancel_Timer;
260 -- kill off the Delayed_Opener task
261 Delayed_Opener.Start_Timer (-10.0);
263 exception
264 when others =>
265 Report.Failed ("exception in main");
266 end;
268 Report.Result;
269 end C954026;