c940002.a
来自「用于进行gcc测试」· A 代码 · 共 310 行
A
310 行
-- C940002.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 a protected object provides coordinated access to shared -- data. Check that it can implement a semaphore-like construct using a-- parameterless procedure which allows a specific maximum number of tasks-- to run and excludes all others---- TEST DESCRIPTION:-- Implement a counting semaphore type that can be initialized to a -- specific number of available resources. Declare an entry for -- requesting a resource and a procedure for releasing it. Declare an -- object of this type, initialized to two resources. Declare and start -- three tasks each of which asks for a resource. Verify that only two -- resources are granted and that the last task in is queued.------ CHANGE HISTORY:-- 06 Dec 94 SAIC ACVC 2.0----!package C940002_0 is -- Semaphores protected type Semaphore_Type (Resources_Available : Integer :=1) is entry Request; procedure Release; function Available return Integer; private Currently_Available : Integer := Resources_Available; end Semaphore_Type; Max_Resources : constant Integer := 2; Resource : Semaphore_Type (Max_Resources);end C940002_0; -- Semaphores; --========================================================--package body C940002_0 is -- Semaphores protected body Semaphore_Type is entry Request when Currently_Available >0 is -- when granted, secures begin -- a resource Currently_Available := Currently_Available - 1; end Request; procedure Release is -- when called, releases begin -- a resource Currently_Available := Currently_Available + 1; end Release; function Available return Integer is -- returns number of begin -- available resources return Currently_Available; end Available; end Semaphore_Type;end C940002_0; -- Semaphores; --========================================================--package C940002_1 is -- Task_Pkg task type Requesting_Task is entry Done; -- call on Done instructs the task end Requesting_Task; -- to release resource type Task_Ptr is access Requesting_Task; protected Counter is procedure Increment; procedure Decrement; function Number return integer; private Count : Integer := 0; end Counter; protected Hold_Lock is procedure Lock; procedure Unlock; function Locked return Boolean; private Lock_State : Boolean := true; -- starts out locked end Hold_Lock;end C940002_1; -- Task_Pkg --========================================================--with Report;with C940002_0; -- Semaphores; package body C940002_1 is -- Task_Pkg is protected body Counter is procedure Increment is begin Count := Count + 1; end Increment; procedure Decrement is begin Count := Count - 1; end Decrement; function Number return Integer is begin return Count; end Number; end Counter; protected body Hold_Lock is procedure Lock is begin Lock_State := true; end Lock; procedure Unlock is begin Lock_State := false; end Unlock; function Locked return Boolean is begin return Lock_State; end Locked; end Hold_Lock; task body Requesting_Task is begin C940002_0.Resource.Request; -- request a resource -- if resource is not available, -- task will be queued to wait Counter.Increment; -- add to count of resources obtained Hold_Lock.Unlock; -- and unlock Lock - system is stable; -- status may now be queried accept Done do -- hold resource until Done is called C940002_0.Resource.Release; -- release the resource and Counter.Decrement; -- note release end Done; exception when others => Report.Failed ("Unexpected Exception in Requesting_Task"); end Requesting_Task;end C940002_1; -- Task_Pkg; --========================================================--with Report;with ImpDef;with C940002_0, -- Semaphores, C940002_1; -- Task_Pkg;procedure C940002 is package Semaphores renames C940002_0; package Task_Pkg renames C940002_1; Ptr1, Ptr2, Ptr3 : Task_Pkg.Task_Ptr; Num : Integer; procedure Spinlock is begin -- loop until unlocked while Task_Pkg.Hold_Lock.Locked loop delay ImpDef.Minimum_Task_Switch; end loop; Task_Pkg.Hold_Lock.Lock; end Spinlock;begin Report.Test ("C940002", "Check that a protected record can be used to " & "control access to resources"); if (Task_Pkg.Counter.Number /=0) or (Semaphores.Resource.Available /= 2) then Report.Failed ("Wrong initial conditions"); end if; Ptr1 := new Task_Pkg.Requesting_Task; -- newly allocated task requests -- resource; request for resource should -- be granted Spinlock; -- ensure that task obtains resource -- Task 1 waiting for call to Done -- One resource assigned to task 1 -- One resource still available if (Task_Pkg.Counter.Number /= 1) or (Semaphores.Resource.Available /= 1) then Report.Failed ("Resource not assigned to task 1"); end if; Ptr2 := new Task_Pkg.Requesting_Task; -- newly allocated task requests -- resource; request for resource should -- be granted Spinlock; -- ensure that task obtains resource -- Task 1 waiting for call to Done -- Task 2 waiting for call to Done -- Resources held by tasks 1 and 2 -- No resources available if (Task_Pkg.Counter.Number /= 2) or (Semaphores.Resource.Available /= 0) then Report.Failed ("Resource not assigned to task 2"); end if; Ptr3 := new Task_Pkg.Requesting_Task; -- newly allocated task requests -- resource; request for resource should -- be denied and task queued to wait for -- next available resource Ptr1.all.Done; -- Task 1 releases resource and lock -- Resource should be given to queued task Spinlock; -- ensure that resource is released -- Task 1 holds no resource -- One resource still assigned to task 2 -- One resource assigned to task 3 -- No resources available if (Task_Pkg.Counter.Number /= 2) or (Semaphores.Resource.Available /= 0) then Report.Failed ("Resource not properly released/assigned to task 3"); end if; Ptr2.all.Done; -- Task 2 releases resource and lock -- No outstanding request for resource -- Tasks 1 and 2 hold no resources -- One resource assigned to task 3 -- One resource available if (Task_Pkg.Counter.Number /= 1) or (Semaphores.Resource.Available /= 1) then Report.Failed ("Resource not properly released from task 2"); end if; Ptr3.all.Done; -- Task 3 releases resource and lock -- All resources released -- All tasks terminated (or close) -- Two resources available if (Task_Pkg.Counter.Number /=0) or (Semaphores.Resource.Available /= 2) then Report.Failed ("Resource not properly released from task 3"); end if; Report.Result;end C940002;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?