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