1-- C974001.A
2--
3--
4--                             Grant of Unlimited Rights
5--
6--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
7--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
8--     unlimited rights in the software and documentation contained herein.
9--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making
10--     this public release, the Government intends to confer upon all
11--     recipients unlimited rights  equal to those held by the Government.
12--     These rights include rights to use, duplicate, release or disclose the
13--     released technical data and computer software in whole or in part, in
14--     any manner and for any purpose whatsoever, and to have or permit others
15--     to do so.
16--
17--                                    DISCLAIMER
18--
19--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
20--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
21--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
22--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
23--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
24--     PARTICULAR PURPOSE OF SAID MATERIAL.
25--*
26--
27-- OBJECTIVE:
28--      Check that the abortable part of an asynchronous select statement
29--      is aborted if it does not complete before the triggering statement
30--      completes, where the triggering statement is a delay_relative
31--      statement and check that the sequence of statements of the triggering
32--      alternative is executed after the abortable part is left.
33--
34-- TEST DESCRIPTION:
35--      Declare a task with an accept statement containing an asynchronous
36--      select with a delay_relative triggering statement. Parameterize
37--      the accept statement with the time to be used in the delay. Simulate a
38--      time-consuming calculation by declaring a procedure containing an
39--      infinite loop. Call this procedure in the abortable part.
40--
41--      The delay will expire before the abortable part completes, at which
42--      time the abortable part is aborted, and the sequence of statements
43--      following the triggering statement is executed.
44--
45--
46-- CHANGE HISTORY:
47--      06 Dec 94   SAIC    ACVC 2.0
48--
49--!
50
51with Report;
52with ImpDef;
53
54procedure C974001 is
55
56
57          --========================================================--
58
59   -- Medium length delay
60   Allotted_Time : constant Duration :=  ImpDef.Switch_To_New_Task;
61
62   Calculation_Canceled : exception;
63
64
65   Count : Integer := 1234;
66
67   procedure Lengthy_Calculation is
68   begin
69      -- Simulate a non-converging calculation.
70      loop                                           -- Infinite loop.
71         Count := (Count + 1) mod 10;
72         delay ImpDef.Minimum_Task_Switch;           -- allow other task
73      end loop;
74   end Lengthy_Calculation;
75
76
77          --========================================================--
78
79
80   task type Timed_Calculation is
81      entry Calculation (Time_Limit : in Duration);
82   end Timed_Calculation;
83
84
85   task body Timed_Calculation is
86   --
87   begin
88      loop
89         select
90            accept Calculation (Time_Limit : in Duration) do
91
92               --                                    --
93               -- Asynchronous select is tested here --
94               --                                    --
95
96               select
97                  delay Time_Limit;           -- Time_Limit is not up yet, so
98                                              -- Lengthy_Calculation starts.
99
100                  raise Calculation_Canceled; -- This is executed after
101                                              -- Lengthy_Calculation aborted.
102               then abort
103                  Lengthy_Calculation;        -- Delay expires before complete,
104                                              -- so this call is aborted.
105
106                  -- Check that the whole of the abortable part is aborted,
107                  -- not just the statement in the abortable part that was
108                  -- executing at the time
109                  Report.Failed ("Abortable part not aborted");
110
111               end select;
112
113               Report.Failed ("Triggering alternative sequence of " &
114                              "statements not executed");
115
116            exception    -- New Ada 9x: handler within accept
117               when Calculation_Canceled =>
118                  if Count = 1234 then
119                     Report.Failed ("Abortable part did not execute");
120                  end if;
121            end Calculation;
122         or
123            terminate;
124         end select;
125      end loop;
126   exception
127      when others =>
128         Report.Failed ("Unexpected exception in Timed_Calculation task");
129   end Timed_Calculation;
130
131
132          --========================================================--
133
134
135begin  -- Main program.
136
137   Report.Test ("C974001", "Asynchronous Select: Trigger is delay_relative" &
138                           " which completes before abortable part");
139
140   declare
141      Timed : Timed_Calculation;  -- Task.
142   begin
143      Timed.Calculation (Time_Limit => Allotted_Time); -- Asynchronous select
144                                                       -- inside accept block.
145   exception
146      when Calculation_Canceled =>
147         null; -- expected behavior
148   end;
149
150   Report.Result;
151
152end C974001;
153