c953001.a

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

A
189
字号
-- C953001.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 if the evaluation of an entry_barrier condition--      propagates an exception, the exception Program_Error--      is propagated to all current callers of all entries of the--      protected object.---- TEST DESCRIPTION:--      This test declares a protected object (PO) with two entries and--      a 5 element entry family.--      All the entries are always closed.  However, one of the entries--      (Oh_No) will get a constraint_error in its barrier_evaluation--      whenever the global variable Blow_Up is true.--      An array of tasks is created where the tasks wait on the various--      entries of the protected object.  Once all the tasks are waiting--      the main procedure calls the entry Oh_No and causes an exception--      to be propagated to all the tasks.  The tasks record the fact --      that they got the correct exception in global variables that--      can be checked after the tasks complete.------ CHANGE HISTORY:--      19 OCT 95   SAIC    ACVC 2.1----!with Report;with ImpDef;procedure C953001 is    Verbose : constant Boolean := False;    Max_Tasks : constant := 12;      -- note status and error conditions    Blocked_Entry_Taken : Boolean := False;    In_Oh_No            : Boolean := False;    Task_Passed : array (1..Max_Tasks) of Boolean := (1..Max_Tasks => False);begin  Report.Test ("C953001",               "Check that an exception in an entry_barrier condition" &               " causes Program_Error to be propagated to all current" &               " callers of all entries of the protected object");  declare -- test encapsulation    -- miscellaneous values    Cows : Integer := Report.Ident_Int (1);    Came_Home : Integer := Report.Ident_Int (2);    -- make the Barrier_Condition fail only when we want it to    Blow_Up : Boolean := False;    function Barrier_Condition return Boolean is    begin      if Blow_Up then         return 5 mod Report.Ident_Int(0) = 1;      else         return False;      end if;    end Barrier_Condition;    subtype Family_Index is Integer range 1..5;    protected PO is      entry Block1;      entry Oh_No;      entry Family (Family_Index);    end PO;    protected body PO is      entry Block1 when Report.Ident_Int(0) = Report.Ident_Int(1) is      begin        Blocked_Entry_Taken := True;      end Block1;      -- barrier will get a Constraint_Error (divide by 0)      entry Oh_No when Barrier_Condition is      begin        In_Oh_No := True;      end Oh_No;      entry Family (for Member in Family_Index) when Cows = Came_Home is      begin        Blocked_Entry_Taken := True;      end Family;    end PO;         task type Waiter is      entry Take_Id (Id : Integer);    end Waiter;    Bunch_of_Waiters : array (1..Max_Tasks) of Waiter;    task body Waiter is      Me : Integer;      Action : Integer;    begin      accept Take_Id (Id : Integer) do         Me := Id;      end Take_Id;      Action := Me mod (Family_Index'Last + 1);      begin        if Action = 0 then          PO.Block1;         else          PO.Family (Action);        end if;        Report.Failed ("no exception for task" & Integer'Image (Me));      exception         when Program_Error =>           Task_Passed (Me) := True;           if Verbose then             Report.Comment ("pass for task" & Integer'Image (Me));           end if;         when others =>           Report.Failed ("wrong exception raised in task" &                          Integer'Image (Me));      end;    end Waiter;  begin   -- test encapsulation    for I in 1..Max_Tasks loop      Bunch_Of_Waiters(I).Take_Id (I);    end loop;    -- give all the Waiters time to get queued    delay 2*ImpDef.Clear_Ready_Queue;    -- cause the protected object to fail    begin      Blow_Up := True;      PO.Oh_No;      Report.Failed ("no exception in call to PO.Oh_No");    exception      when Constraint_Error =>         Report.Failed ("Constraint_Error instead of Program_Error");      when Program_Error =>         if Verbose then           Report.Comment ("main exception passed");         end if;      when others =>         Report.Failed ("wrong exception in main");    end;  end;    -- test encapsulation  -- all the tasks have now completed.  -- check the flags for pass/fail info  if Blocked_Entry_Taken then     Report.Failed ("blocked entry taken");  end if;  if In_Oh_No then     Report.Failed ("entry taken with exception in barrier");  end if;  for I in 1..Max_Tasks loop    if not Task_Passed (I) then      Report.Failed ("task" & Integer'Image (I) & " did not pass");    end if;  end loop;  Report.Result;end C953001;

⌨️ 快捷键说明

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