2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / ada / acats / tests / c9 / c974013.a
blob4a930da93b3ead57a35faf001c15f3924a551ede
1 -- C974013.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 the abortable part of an asynchronous select statement
28 -- is aborted if it does not complete before the triggering statement
29 -- completes, where the triggering statement is a delay_until
30 -- statement.
32 -- Check that the sequence of statements of the triggering alternative
33 -- is executed after the abortable part is left.
35 -- TEST DESCRIPTION:
36 -- Declare a task with an accept statement containing an asynchronous
37 -- select with a delay_until triggering statement. Parameterize
38 -- the accept statement with the amount of time to be added to the
39 -- current time to be used for the delay. Simulate a time-consuming
40 -- calculation by declaring a procedure containing an infinite loop.
41 -- Call this procedure in the abortable part.
43 -- The delay will expire before the abortable part completes, at which
44 -- time the abortable part is aborted, and the sequence of statements
45 -- following the triggering statement is executed.
47 -- Main test logic is identical to c974001 which uses simple delay
50 -- CHANGE HISTORY:
51 -- 06 Dec 94 SAIC ACVC 2.0
52 -- 28 Nov 95 SAIC Fixed problems for ACVC 2.0.1.
54 --!
56 with Report;
57 with ImpDef;
58 with Ada.Calendar;
60 procedure C974013 is
63 --========================================================--
65 function "+" (Left : Ada.Calendar.Time; Right: Duration)
66 return Ada.Calendar.Time renames Ada.Calendar."+";
69 Allotted_Time : constant Duration := ImpDef.Switch_To_New_Task;
70 Calculation_Canceled : exception;
72 Count : Integer := 1234;
73 procedure Lengthy_Calculation is
74 begin
75 -- Simulate a non-converging calculation.
76 loop -- Infinite loop.
77 Count := (Count + 1) mod 10;
78 exit when not Report.Equal (Count, Count); -- Condition always false.
79 delay 0.0; -- abort completion point
80 end loop;
81 end Lengthy_Calculation;
84 --========================================================--
87 task type Timed_Calculation is
88 entry Calculation (Time_Limit : in Duration);
89 end Timed_Calculation;
92 task body Timed_Calculation is
93 Delay_Time : Ada.Calendar.Time;
94 begin
95 loop
96 select
97 accept Calculation (Time_Limit : in Duration) do
99 -- We have to construct an "until" time artificially
100 -- as we have no control over when the test will be run
102 Delay_Time := Ada.Calendar.Clock + Time_Limit;
104 -- --
105 -- Asynchronous select is tested here --
106 -- --
108 select
110 delay until Delay_Time; -- Time not reached yet, so
111 -- Lengthy_Calculation starts.
113 raise Calculation_Canceled; -- This is executed after
114 -- Lengthy_Calculation aborted.
116 then abort
118 Lengthy_Calculation; -- Delay expires before complete,
119 -- so this call is aborted.
120 -- Check that the whole of the abortable part is aborted,
121 -- not just the statement in the abortable part that was
122 -- executing at the time
123 Report.Failed ("Abortable part not aborted");
125 end select;
127 Report.Failed ("Triggering alternative sequence of " &
128 "statements not executed");
130 exception -- New Ada 9x: handler within accept
131 when Calculation_Canceled =>
132 if Count = 1234 then
133 Report.Failed ("Abortable part did not execute");
134 end if;
135 end Calculation;
137 terminate;
138 end select;
139 end loop;
140 exception
141 when others =>
142 Report.Failed ("Unexpected exception in Timed_Calculation task");
143 end Timed_Calculation;
146 --========================================================--
150 begin -- Main program.
152 Report.Test ("C974013", "Asynchronous Select: Trigger is delay_until " &
153 "which completes before abortable part");
155 declare
156 Timed : Timed_Calculation; -- Task.
157 begin
158 Timed.Calculation (Time_Limit => Allotted_Time); -- Asynchronous select
159 -- inside accept block.
160 exception
161 when Calculation_Canceled =>
162 Report.Failed ("wrong exception handler used");
163 end;
165 Report.Result;
167 end C974013;