-- C910003.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687 and -- F08630-91-C-0015, 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 task discriminants that have an access subtype may be -- dereferenced. -- -- Note that discriminants in Ada 83 never can be dereferenced with -- selection or indexing, as they cannot have an access type. -- -- TEST DESCRIPTION: -- A protected object is defined to create a simple buffer. -- Two task types are defined, one to put values into the buffer, -- and one to remove them. The tasks are passed a buffer object as -- a discriminant with an access subtype. The producer task type includes -- a discriminant to determine the values to product. The consumer task -- type includes a value to save the results. -- Two producer and one consumer tasks are declared, and the results -- are checked. -- -- CHANGE HISTORY: -- 10 Mar 99 RLB Created test. -- --! package C910003_Pack is type Item_Type is range 1 .. 100; -- In a real application, this probably -- would be a record type. type Item_Array is array (Positive range <>) of Item_Type; protected type Buffer is entry Put (Item : in Item_Type); entry Get (Item : out Item_Type); function TC_Items_Buffered return Item_Array; private Saved_Item : Item_Type; Empty : Boolean := True; TC_Items : Item_Array (1 .. 10); TC_Last : Natural := 0; end Buffer; type Buffer_Access_Type is access Buffer; PRODUCE_COUNT : constant := 2; -- Number of items to produce. task type Producer (Buffer_Access : Buffer_Access_Type; Start_At : Item_Type); -- Produces PRODUCE_COUNT items. Starts when activated. type TC_Item_Array_Access_Type is access Item_Array (1 .. PRODUCE_COUNT*2); task type Consumer (Buffer_Access : Buffer_Access_Type; Results : TC_Item_Array_Access_Type) is -- Stores PRODUCE_COUNT*2 items consumed in Results. Starts when -- activated. entry Wait_until_Done; end Consumer; end C910003_Pack; with Report; package body C910003_Pack is protected body Buffer is entry Put (Item : in Item_Type) when Empty is begin Empty := False; Saved_Item := Item; TC_Last := TC_Last + 1; TC_Items(TC_Last) := Item; end Put; entry Get (Item : out Item_Type) when not Empty is begin Empty := True; Item := Saved_Item; end Get; function TC_Items_Buffered return Item_Array is begin return TC_Items(1..TC_Last); end TC_Items_Buffered; end Buffer; task body Producer is -- Produces PRODUCE_COUNT items. Starts when activated. begin for I in 1 .. Report.Ident_Int(PRODUCE_COUNT) loop Buffer_Access.Put (Start_At + (Item_Type(I)-1)*2); end loop; end Producer; task body Consumer is -- Stores PRODUCE_COUNT*2 items consumed in Results. Starts when -- activated. begin for I in 1 .. Report.Ident_Int(PRODUCE_COUNT*2) loop Buffer_Access.Get (Results (I)); -- Buffer_Access and Results are both dereferenced. end loop; -- Check the results (and function call with a prefix dereference). if Results.all(Report.Ident_Int(1)) /= Buffer_Access.all.TC_Items_Buffered(Report.Ident_Int(1)) then Report.Failed ("First item mismatch"); end if; if Results(Report.Ident_Int(2)) /= Buffer_Access.TC_Items_Buffered(Report.Ident_Int(2)) then Report.Failed ("Second item mismatch"); end if; accept Wait_until_Done; -- Tell main that we're done. end Consumer; end C910003_Pack; with Report; with C910003_Pack; procedure C910003 is begin -- C910003 Report.Test ("C910003", "Check that tasks discriminants of access types can be dereferenced"); declare -- encapsulate the test Buffer_Access : C910003_Pack.Buffer_Access_Type := new C910003_Pack.Buffer; TC_Results : C910003_Pack.TC_Item_Array_Access_Type := new C910003_Pack.Item_Array (1 .. C910003_Pack.PRODUCE_COUNT*2); Producer_1 : C910003_Pack.Producer (Buffer_Access, 12); Producer_2 : C910003_Pack.Producer (Buffer_Access, 23); Consumer : C910003_Pack.Consumer (Buffer_Access, TC_Results); use type C910003_Pack.Item_Array; -- For /=. begin Consumer.Wait_until_Done; if TC_Results.all /= Buffer_Access.TC_Items_Buffered then Report.Failed ("Different items buffered than returned - Main"); end if; if (TC_Results.all /= (12, 14, 23, 25) and TC_Results.all /= (12, 23, 14, 25) and TC_Results.all /= (12, 23, 25, 14) and TC_Results.all /= (23, 12, 14, 25) and TC_Results.all /= (23, 12, 25, 14) and TC_Results.all /= (23, 25, 12, 14)) then -- Above are the only legal results. Report.Failed ("Wrong results"); end if; end; -- encapsulation Report.Result; end C910003;