c951001.a
来自「linux下编程用 编译软件」· A 代码 · 共 193 行
A
193 行
-- 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?