-- 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 is begin 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;