| -- C951001.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 two procedures in a protected object will not be |
| -- executed concurrently. |
| -- |
| -- TEST DESCRIPTION: |
| -- A very simple example of two tasks calling two procedures in the same |
| -- protected object is used. Test control code has been added to the |
| -- procedures such that, whichever gets called first executes a lengthy |
| -- calculation giving sufficient time (on a multiprocessor or a |
| -- time-slicing machine) for the other task to get control and call the |
| -- other procedure. The control code verifies that entry to the second |
| -- routine is postponed until the first is complete. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- |
| --! |
| |
| with Report; |
| with ImpDef; |
| |
| procedure C951001 is |
| |
| protected Ramp_31 is |
| |
| procedure Add_Meter_Queue; |
| procedure Subtract_Meter_Queue; |
| function TC_Failed return Boolean; |
| |
| private |
| |
| Ramp_Count : integer range 0..20 := 4; -- Start test with some |
| -- vehicles on the ramp |
| |
| TC_Add_Started : Boolean := false; |
| TC_Subtract_Started : Boolean := false; |
| TC_Add_Finished : Boolean := false; |
| TC_Subtract_Finished : Boolean := false; |
| TC_Concurrent_Running: Boolean := false; |
| |
| end Ramp_31; |
| |
| |
| protected body Ramp_31 is |
| |
| function TC_Failed return Boolean is |
| begin |
| -- this indicator will have been set true if any instance |
| -- of concurrent running has been proved |
| return TC_Concurrent_Running; |
| end TC_Failed; |
| |
| |
| procedure Add_Meter_Queue is |
| begin |
| --================================================== |
| -- This section is all Test_Control code |
| TC_Add_Started := true; |
| if TC_Subtract_Started then |
| if not TC_Subtract_Finished then |
| TC_Concurrent_Running := true; |
| end if; |
| else |
| -- Subtract has not started. |
| -- Execute a lengthy routine to give it a chance to do so |
| ImpDef.Exceed_Time_Slice; |
| |
| if TC_Subtract_Started then |
| -- Subtract was able to start so we have concurrent |
| -- running and the test has failed |
| TC_Concurrent_Running := true; |
| end if; |
| end if; |
| TC_Add_Finished := true; |
| --================================================== |
| Ramp_Count := Ramp_Count + 1; |
| end Add_Meter_Queue; |
| |
| procedure Subtract_Meter_Queue is |
| begin |
| --================================================== |
| -- This section is all Test_Control code |
| TC_Subtract_Started := true; |
| if TC_Add_Started then |
| if not TC_Add_Finished then |
| -- We already have concurrent running |
| TC_Concurrent_Running := true; |
| end if; |
| else |
| -- Add has not started. |
| -- Execute a lengthy routine to give it a chance to do so |
| ImpDef.Exceed_Time_Slice; |
| |
| if TC_Add_Started then |
| -- Add was able to start so we have concurrent |
| -- running and the test has failed |
| TC_Concurrent_Running := true; |
| end if; |
| end if; |
| TC_Subtract_Finished := true; |
| --================================================== |
| Ramp_Count := Ramp_Count - 1; |
| end Subtract_Meter_Queue; |
| |
| end Ramp_31; |
| |
| begin |
| |
| Report.Test ("C951001", "Check that two procedures in a protected" & |
| " object will not be executed concurrently"); |
| |
| declare -- encapsulate the test |
| |
| task Vehicle_1; |
| task Vehicle_2; |
| |
| |
| -- Vehicle_1 and Vehicle_2 are simulations of Instances of the task |
| -- of type Vehicle in different stages of execution |
| |
| task body Vehicle_1 is |
| begin |
| null; -- ::::: stub. preparation code |
| |
| -- Add to the count of vehicles on the queue |
| Ramp_31.Add_Meter_Queue; |
| |
| null; -- ::::: stub: wait at the meter then pass to first sensor |
| |
| -- Reduce the count of vehicles on the queue |
| null; -- ::::: stub: Ramp_31.Subtract_Meter_Queue |
| exception |
| when others => |
| Report.Failed ("Unexpected Exception in Vehicle_1 task"); |
| end Vehicle_1; |
| |
| |
| task body Vehicle_2 is |
| begin |
| null; -- ::::: stub. preparation code |
| |
| -- Add to the count of vehicles on the queue |
| null; -- ::::: stub Ramp_31.Add_Meter_Queue; |
| |
| null; -- ::::: stub: wait at the meter then pass to first sensor |
| |
| -- Reduce the count of vehicles on the queue |
| Ramp_31.Subtract_Meter_Queue; |
| exception |
| when others => |
| Report.Failed ("Unexpected Exception in Vehicle_2 task"); |
| end Vehicle_2; |
| |
| |
| |
| begin |
| null; |
| end; -- encapsulation |
| |
| if Ramp_31.TC_Failed then |
| Report.Failed ("Concurrent Running detected"); |
| end if; |
| |
| Report.Result; |
| |
| end C951001; |