c930001.a

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

A
154
字号
-- C930001.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.--*---- TEST OBJECTIVE:--      Check when a dependent task and its master both--      terminate as a result of a terminate alternative that--      finalization is performed and that the finalization is--      performed in the proper order.---- TEST DESCRIPTION:--      A controlled type with finalization is used to determine--      the order in which finalization occurs.  The finalization--      procedure records the identity of the object being--      finalized.--      Two tasks, one nested inside the other, both contain --      objects of the above finalization type.  These tasks--      cooperatively terminate so the termination and finalization--      order can be noted.------ CHANGE HISTORY:--      08 Jan 96   SAIC    ACVC 2.1--      09 May 96   SAIC    Addressed Reviewer comments.----!with Ada.Finalization;package C930001_0 is    Verbose : constant Boolean := False;    type Ids is range 0..10;    Finalization_Order : array (Ids) of Ids := (Ids => 0);    Finalization_Cnt : Ids := 0;    protected Note is       -- serializes concurrent access to Finalization_* above       procedure Done (Id : Ids);    end Note;    -- Objects of the following type are used to note the order in    -- which finalization occurs.    type Has_Finalization is new Ada.Finalization.Limited_Controlled with          record             Id : Ids;          end record;    procedure Finalize (Object : in out Has_Finalization);end C930001_0;with Report;package body C930001_0 is    protected body Note is        procedure Done (Id : Ids) is        begin            Finalization_Cnt := Finalization_Cnt + 1;            Finalization_Order (Finalization_Cnt) := Id;        end Done;    end Note;    procedure Finalize (Object : in out Has_Finalization) is    begin        Note.Done (Object.Id);        if Verbose then            Report.Comment ("in Finalize for" & Ids'Image (Object.Id));        end if;    end Finalize;end C930001_0;with Report;with ImpDef;with C930001_0;   use C930001_0;procedure C930001 isbegin     Report.Test ("C930001", "Check that dependent tasks are terminated" &                            " before the remaining finalization");    declare        task Level_1;        task body Level_1 is            V1a : C930001_0.Has_Finalization;        -------> 4            task Level_2 is                entry Not_Taken;            end Level_2;            task body Level_2 is                V2 : C930001_0.Has_Finalization;     -------> 2            begin                V2.Id := 2;                C930001_0.Note.Done (1);             -------> 1                select                    accept Not_Taken;                or                    terminate;                    -- cooperative termination at this point of                    -- both tasks                end select;            end Level_2;            -- 7.6.1(11) requires that V1b be finalized before V1a            V1b : C930001_0.Has_Finalization;        -------> 3        begin            V1a.Id := 4;            V1b.Id := 3;        end Level_1;    begin  -- declare        while not Level_1'Terminated loop             delay ImpDef.Switch_To_New_Task;        end loop;        C930001_0.Note.Done (5);                     -------> 5                -- now check the order        for I in Ids range 1..5 loop            if Verbose then                Report.Comment (Ids'Image (I) &                        Ids'Image (Finalization_Order (I)));            end if;            if Finalization_Order (I) /= I then                Report.Failed ("Finalization occurred out of order" &                   " expected:" &                   Ids'Image (I) &                   " actual:" &                   Ids'Image (Finalization_Order (I)));            end if;        end loop;    end;    Report.Result;end C930001;

⌨️ 快捷键说明

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