c974002.a

来自「linux下编程用 编译软件」· A 代码 · 共 210 行

A
210
字号
-- C974002.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 sequence of statements of the triggering alternative--      of an asynchronous select statement is executed if the triggering--      statement is a delay_until statement, and the specified time has--      already passed. Check that the abortable part is not executed after--      the sequence of statements of the triggering alternative is left.----      Check that the sequence of statements of the triggering alternative--      of an asynchronous select statement is not executed if the abortable--      part completes before the triggering statement, and the triggering--      statement is a delay_until statement.---- TEST DESCRIPTION:--      Declare a task with an accept statement containing an asynchronous--      select with a delay_until triggering statement. Parameterize--      the accept statement with the time to be used in the delay. Simulate--      a quick calculation by declaring a procedure which sets a Boolean--      flag. Call this procedure in the abortable part.----      Make two calls to the task entry: (1) with a time that has already--      expired, and (2) with a time that will not expire before the quick--      calculation completes.----      For (1), the sequence of statements following the triggering statement--      is executed, and the abortable part never starts.----      For (2), the abortable part completes before the triggering statement,--      the delay is canceled, and the sequence of statements following the--      triggering statement never starts.------ CHANGE HISTORY:--      06 Dec 94   SAIC    ACVC 2.0--      26 Nov 95   SAIC    Bug fix for ACVC 2.0.1.----!with Report;with Ada.Calendar;with ImpDef;procedure C974002 is   function "-" (Left: Ada.Calendar.Time; Right: Duration )                          return Ada.Calendar.Time renames Ada.Calendar."-";   function "+" (Left: Ada.Calendar.Time; Right: Duration )                           return Ada.Calendar.Time renames Ada.Calendar."+";      Abortable_Part_Executed         : Boolean;   Triggering_Alternative_Executed : Boolean;          --========================================================--   procedure Quick_Calculation is   begin      if Report.Equal (1, 1) then         Abortable_Part_Executed := True;      end if;   end Quick_Calculation;          --========================================================--   task type Timed_Calculation_Task is      entry Calculation (Time_Out : in Ada.Calendar.Time);   end Timed_Calculation_Task;   task body Timed_Calculation_Task is   begin      loop         select            accept Calculation (Time_Out : in Ada.Calendar.Time) do               --                                    --               -- Asynchronous select is tested here --               --                                    --               select                  delay until Time_Out;                    -- Triggering                                                            -- statement.                  Triggering_Alternative_Executed := True; -- Triggering                                                           -- alternative.               then abort                  Quick_Calculation;                       -- Abortable part.               end select;            end Calculation;         or            terminate;         end select;      end loop;   exception      when others =>         Report.Failed ("Unexpected exception in Timed_Calculation_Task");   end Timed_Calculation_Task;          --========================================================--   Start_Time : constant Ada.Calendar.Time :=                          Ada.Calendar.Time_of (1901,1,1);   Minute     : constant Duration          := 60.0;          --========================================================--begin  -- Main program.   Report.Test ("C974002", "Asynchronous Select with Delay_Until");     -- take care of implementations that start the clock at 1/1/01    delay ImpDef.Delay_For_Time_Past;   Abortable_Part_Executed         := False;   Triggering_Alternative_Executed := False;   NO_DELAY_SUBTEST:      declare         -- Set Expiry to a time which has already passed         Expiry : constant Ada.Calendar.Time := Start_Time;          Timed  : Timed_Calculation_Task;      begin         -- Expiry is the time to be specified in the delay_until statement         -- of the asynchronous select. Since it has already passed, the         -- abortable part should not execute, and the sequence of statements         -- of the triggering alternative should be executed.         Timed.Calculation (Time_Out => Expiry);   -- Asynchronous select                                                   -- inside accept block.         if Abortable_Part_Executed then            Report.Failed ("No delay: Abortable part was executed");         end if;         if not Triggering_Alternative_Executed then            Report.Failed ("No delay: triggering alternative sequence " &                           "of statements was not executed");         end if;      end No_Delay_Subtest;   Abortable_Part_Executed         := False;   Triggering_Alternative_Executed := False;   LONG_DELAY_SUBTEST:      declare         -- Quick_Calculation should finish before expiry.         Expiry : constant Ada.Calendar.Time :=                                             Ada.Calendar.Clock + Minute;         Timed  : Timed_Calculation_Task;      begin         -- Expiry is the time to be specified in the delay_until statement         -- of the asynchronous select. It should not pass before the abortable         -- part completes, at which time control should return to the caller;         -- the sequence of statements of the triggering alternative should         -- not be executed.         Timed.Calculation (Time_Out => Expiry);  -- Asynchronous select.         if not Abortable_Part_Executed then            Report.Failed ("Long delay: Abortable part was not executed");         end if;         if Triggering_Alternative_Executed then            Report.Failed ("Long delay: triggering alternative sequence " &                           "of statements was executed");         end if;      end Long_Delay_Subtest;   Report.Result;end C974002;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?