-- C953003.A
|
-- C953003.A
|
--
|
--
|
-- Grant of Unlimited Rights
|
-- Grant of Unlimited Rights
|
--
|
--
|
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
|
-- 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
|
-- 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 in the software and documentation contained herein.
|
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
|
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
|
-- this public release, the Government intends to confer upon all
|
-- this public release, the Government intends to confer upon all
|
-- recipients unlimited rights equal to those held by the Government.
|
-- recipients unlimited rights equal to those held by the Government.
|
-- These rights include rights to use, duplicate, release or disclose the
|
-- These rights include rights to use, duplicate, release or disclose the
|
-- released technical data and computer software in whole or in part, in
|
-- 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
|
-- any manner and for any purpose whatsoever, and to have or permit others
|
-- to do so.
|
-- to do so.
|
--
|
--
|
-- DISCLAIMER
|
-- DISCLAIMER
|
--
|
--
|
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
|
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
|
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
|
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
|
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
|
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
|
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
|
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
|
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
|
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
|
-- PARTICULAR PURPOSE OF SAID MATERIAL.
|
-- PARTICULAR PURPOSE OF SAID MATERIAL.
|
--*
|
--*
|
--
|
--
|
-- OBJECTIVE:
|
-- OBJECTIVE:
|
-- Check that the servicing of entry queues of a protected object
|
-- Check that the servicing of entry queues of a protected object
|
-- continues until there are no open entries with queued (or
|
-- continues until there are no open entries with queued (or
|
-- requeued) calls and that internal requeues are handled
|
-- requeued) calls and that internal requeues are handled
|
-- as part of a single protected operation.
|
-- as part of a single protected operation.
|
--
|
--
|
-- TEST DESCRIPTION:
|
-- TEST DESCRIPTION:
|
-- A number of tasks are created and blocked on a protected object
|
-- A number of tasks are created and blocked on a protected object
|
-- so that they can all be released at one time. When released,
|
-- so that they can all be released at one time. When released,
|
-- these tasks make an entry call to an entry in the Main_PO
|
-- these tasks make an entry call to an entry in the Main_PO
|
-- protected object. As part of the servicing of this entry
|
-- protected object. As part of the servicing of this entry
|
-- call the call is passed through the remaining entries of the
|
-- call the call is passed through the remaining entries of the
|
-- protected object by using internal requeues. The protected
|
-- protected object by using internal requeues. The protected
|
-- object checks that no other entry call is accepted until
|
-- object checks that no other entry call is accepted until
|
-- after all the internal requeuing has completed.
|
-- after all the internal requeuing has completed.
|
--
|
--
|
--
|
--
|
-- CHANGE HISTORY:
|
-- CHANGE HISTORY:
|
-- 12 JAN 96 SAIC Initial version for 2.1
|
-- 12 JAN 96 SAIC Initial version for 2.1
|
--
|
--
|
--!
|
--!
|
|
|
with Report;
|
with Report;
|
procedure C953003 is
|
procedure C953003 is
|
Verbose : constant Boolean := False;
|
Verbose : constant Boolean := False;
|
|
|
Order_Error : Boolean := False;
|
Order_Error : Boolean := False;
|
|
|
Max_Tasks : constant := 10; -- total number of tasks
|
Max_Tasks : constant := 10; -- total number of tasks
|
Max_Entries : constant := 4; -- number of entries in Main_PO
|
Max_Entries : constant := 4; -- number of entries in Main_PO
|
Note_Cnt : Integer := 0;
|
Note_Cnt : Integer := 0;
|
Note_Order : array (1..Max_Tasks*Max_Entries) of Integer;
|
Note_Order : array (1..Max_Tasks*Max_Entries) of Integer;
|
begin
|
begin
|
Report.Test ("C953003",
|
Report.Test ("C953003",
|
"Check that the servicing of entry queues handles all" &
|
"Check that the servicing of entry queues handles all" &
|
" open entries as part of a single protected operation," &
|
" open entries as part of a single protected operation," &
|
" including those resulting from an internal requeue");
|
" including those resulting from an internal requeue");
|
declare
|
declare
|
task type Assault_PO is
|
task type Assault_PO is
|
entry Take_ID (Id : Integer);
|
entry Take_ID (Id : Integer);
|
end Assault_PO;
|
end Assault_PO;
|
|
|
Marines : array (1 .. Max_Tasks) of Assault_PO;
|
Marines : array (1 .. Max_Tasks) of Assault_PO;
|
|
|
protected Main_PO is
|
protected Main_PO is
|
entry E0 (Who : Integer);
|
entry E0 (Who : Integer);
|
private
|
private
|
entry E3 (Who : Integer);
|
entry E3 (Who : Integer);
|
entry E2 (Who : Integer);
|
entry E2 (Who : Integer);
|
entry E1 (Who : Integer);
|
entry E1 (Who : Integer);
|
Expected_Next : Integer := 0;
|
Expected_Next : Integer := 0;
|
end Main_PO;
|
end Main_PO;
|
|
|
|
|
protected body Main_PO is
|
protected body Main_PO is
|
|
|
entry E0 (Who : Integer) when True is
|
entry E0 (Who : Integer) when True is
|
begin
|
begin
|
Order_Error := Order_Error or Expected_Next /= 0;
|
Order_Error := Order_Error or Expected_Next /= 0;
|
Expected_Next := 1;
|
Expected_Next := 1;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Order (Note_Cnt) := Who;
|
Note_Order (Note_Cnt) := Who;
|
requeue E1;
|
requeue E1;
|
end E0;
|
end E0;
|
|
|
entry E1 (Who : Integer) when True is
|
entry E1 (Who : Integer) when True is
|
begin
|
begin
|
Order_Error := Order_Error or Expected_Next /= 1;
|
Order_Error := Order_Error or Expected_Next /= 1;
|
Expected_Next := 2;
|
Expected_Next := 2;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Order (Note_Cnt) := Who;
|
Note_Order (Note_Cnt) := Who;
|
requeue E2;
|
requeue E2;
|
end E1;
|
end E1;
|
|
|
entry E3 (Who : Integer) when True is
|
entry E3 (Who : Integer) when True is
|
begin
|
begin
|
Order_Error := Order_Error or Expected_Next /= 3;
|
Order_Error := Order_Error or Expected_Next /= 3;
|
Expected_Next := 0;
|
Expected_Next := 0;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Order (Note_Cnt) := Who;
|
Note_Order (Note_Cnt) := Who;
|
-- all done - return now
|
-- all done - return now
|
end E3;
|
end E3;
|
|
|
entry E2 (Who : Integer) when True is
|
entry E2 (Who : Integer) when True is
|
begin
|
begin
|
Order_Error := Order_Error or Expected_Next /= 2;
|
Order_Error := Order_Error or Expected_Next /= 2;
|
Expected_Next := 3;
|
Expected_Next := 3;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Cnt := Note_Cnt + 1;
|
Note_Order (Note_Cnt) := Who;
|
Note_Order (Note_Cnt) := Who;
|
requeue E3;
|
requeue E3;
|
end E2;
|
end E2;
|
end Main_PO;
|
end Main_PO;
|
|
|
protected Holding_Pen is
|
protected Holding_Pen is
|
entry Wait_For_All_Present;
|
entry Wait_For_All_Present;
|
entry Wait;
|
entry Wait;
|
private
|
private
|
Open : Boolean := False;
|
Open : Boolean := False;
|
end Holding_Pen;
|
end Holding_Pen;
|
|
|
protected body Holding_Pen is
|
protected body Holding_Pen is
|
entry Wait_For_All_Present when Wait'Count = Max_Tasks is
|
entry Wait_For_All_Present when Wait'Count = Max_Tasks is
|
begin
|
begin
|
Open := True;
|
Open := True;
|
end Wait_For_All_Present;
|
end Wait_For_All_Present;
|
|
|
entry Wait when Open is
|
entry Wait when Open is
|
begin
|
begin
|
null; -- just go
|
null; -- just go
|
end Wait;
|
end Wait;
|
end Holding_Pen;
|
end Holding_Pen;
|
|
|
|
|
task body Assault_PO is
|
task body Assault_PO is
|
Me : Integer;
|
Me : Integer;
|
begin
|
begin
|
accept Take_Id (Id : Integer) do
|
accept Take_Id (Id : Integer) do
|
Me := Id;
|
Me := Id;
|
end Take_Id;
|
end Take_Id;
|
Holding_Pen.Wait;
|
Holding_Pen.Wait;
|
Main_PO.E0 (Me);
|
Main_PO.E0 (Me);
|
if Verbose then
|
if Verbose then
|
Report.Comment ("task" & Integer'Image (Me) &
|
Report.Comment ("task" & Integer'Image (Me) &
|
" done");
|
" done");
|
end if;
|
end if;
|
exception
|
exception
|
when others =>
|
when others =>
|
Report.Failed ("exception in task");
|
Report.Failed ("exception in task");
|
end Assault_PO;
|
end Assault_PO;
|
|
|
begin -- test encapsulation
|
begin -- test encapsulation
|
for I in Marines'Range loop
|
for I in Marines'Range loop
|
Marines (I).Take_ID (100 + I);
|
Marines (I).Take_ID (100 + I);
|
end loop;
|
end loop;
|
|
|
-- let all the tasks get blocked so we can release them all
|
-- let all the tasks get blocked so we can release them all
|
-- at one time
|
-- at one time
|
Holding_Pen.Wait_For_All_Present;
|
Holding_Pen.Wait_For_All_Present;
|
|
|
-- wait for all the tasks to complete
|
-- wait for all the tasks to complete
|
if Verbose then
|
if Verbose then
|
Report.Comment ("waiting for tasks to complete");
|
Report.Comment ("waiting for tasks to complete");
|
end if;
|
end if;
|
end;
|
end;
|
|
|
-- make sure all tasks registered their order
|
-- make sure all tasks registered their order
|
if Note_Cnt /= Max_Tasks * Max_Entries then
|
if Note_Cnt /= Max_Tasks * Max_Entries then
|
Report.Failed ("task registration count wrong. " &
|
Report.Failed ("task registration count wrong. " &
|
Integer'Image (Note_Cnt));
|
Integer'Image (Note_Cnt));
|
end if;
|
end if;
|
|
|
if Order_Error then
|
if Order_Error then
|
Report.Failed ("internal requeue not handled as part of operation");
|
Report.Failed ("internal requeue not handled as part of operation");
|
end if;
|
end if;
|
|
|
if Verbose or Order_Error then
|
if Verbose or Order_Error then
|
for I in 1..Max_Tasks * Max_Entries loop
|
for I in 1..Max_Tasks * Max_Entries loop
|
Report.Comment ("order" & Integer'Image (I) & " is" &
|
Report.Comment ("order" & Integer'Image (I) & " is" &
|
Integer'Image (Note_Order (I)));
|
Integer'Image (Note_Order (I)));
|
end loop;
|
end loop;
|
end if;
|
end if;
|
|
|
Report.Result;
|
Report.Result;
|
end C953003;
|
end C953003;
|
|
|