-- C974001.A -- -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained -- unlimited rights in the software and documentation contained herein. -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making -- this public release, the Government intends to confer upon all -- recipients unlimited rights equal to those held by the Government. -- These rights include rights to use, duplicate, release or disclose the -- released technical data and computer software in whole or in part, in -- any manner and for any purpose whatsoever, and to have or permit others -- to do so. -- -- DISCLAIMER -- -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A -- PARTICULAR PURPOSE OF SAID MATERIAL. --* -- -- OBJECTIVE: -- Check that the abortable part of an asynchronous select statement -- is aborted if it does not complete before the triggering statement -- completes, where the triggering statement is a delay_relative -- statement and check that the sequence of statements of the triggering -- alternative is executed after the abortable part is left. -- -- TEST DESCRIPTION: -- Declare a task with an accept statement containing an asynchronous -- select with a delay_relative triggering statement. Parameterize -- the accept statement with the time to be used in the delay. Simulate a -- time-consuming calculation by declaring a procedure containing an -- infinite loop. Call this procedure in the abortable part. -- -- The delay will expire before the abortable part completes, at which -- time the abortable part is aborted, and the sequence of statements -- following the triggering statement is executed. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! with Report; with ImpDef; procedure C974001 is --========================================================-- -- Medium length delay Allotted_Time : constant Duration := ImpDef.Switch_To_New_Task; Calculation_Canceled : exception; Count : Integer := 1234; procedure Lengthy_Calculation is begin -- Simulate a non-converging calculation. loop -- Infinite loop. Count := (Count + 1) mod 10; delay ImpDef.Minimum_Task_Switch; -- allow other task end loop; end Lengthy_Calculation; --========================================================-- task type Timed_Calculation is entry Calculation (Time_Limit : in Duration); end Timed_Calculation; task body Timed_Calculation is -- begin loop select accept Calculation (Time_Limit : in Duration) do -- -- -- Asynchronous select is tested here -- -- -- select delay Time_Limit; -- Time_Limit is not up yet, so -- Lengthy_Calculation starts. raise Calculation_Canceled; -- This is executed after -- Lengthy_Calculation aborted. then abort Lengthy_Calculation; -- Delay expires before complete, -- so this call is aborted. -- Check that the whole of the abortable part is aborted, -- not just the statement in the abortable part that was -- executing at the time Report.Failed ("Abortable part not aborted"); end select; Report.Failed ("Triggering alternative sequence of " & "statements not executed"); exception -- New Ada 9x: handler within accept when Calculation_Canceled => if Count = 1234 then Report.Failed ("Abortable part did not execute"); end if; end Calculation; or terminate; end select; end loop; exception when others => Report.Failed ("Unexpected exception in Timed_Calculation task"); end Timed_Calculation; --========================================================-- begin -- Main program. Report.Test ("C974001", "Asynchronous Select: Trigger is delay_relative" & " which completes before abortable part"); declare Timed : Timed_Calculation; -- Task. begin Timed.Calculation (Time_Limit => Allotted_Time); -- Asynchronous select -- inside accept block. exception when Calculation_Canceled => null; -- expected behavior end; Report.Result; end C974001;