-- C954026.A
|
-- C954026.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 if the original protected entry call was a conditional
|
-- Check that if the original protected entry call was a conditional
|
-- entry call, the call is cancelled if a requeue-with-abort of the
|
-- entry call, the call is cancelled if a requeue-with-abort of the
|
-- call is not selected immediately.
|
-- call is not selected immediately.
|
-- Check that if the original protected entry call was a timed entry
|
-- Check that if the original protected entry call was a timed entry
|
-- call, the expiration time for a requeue-with-abort is the original
|
-- call, the expiration time for a requeue-with-abort is the original
|
-- expiration time.
|
-- expiration time.
|
--
|
--
|
-- TEST DESCRIPTION:
|
-- TEST DESCRIPTION:
|
-- In this test the main task makes a variety of calls to the protected
|
-- In this test the main task makes a variety of calls to the protected
|
-- object Initial_PO. These calls include a simple call, a conditional
|
-- object Initial_PO. These calls include a simple call, a conditional
|
-- call, and a timed call. The timed calls include calls with enough
|
-- call, and a timed call. The timed calls include calls with enough
|
-- time and those with less than the needed amount of time to get through
|
-- time and those with less than the needed amount of time to get through
|
-- the requeue performed by Initial_PO.
|
-- the requeue performed by Initial_PO.
|
-- Initial_PO requeues its entry call to Final_PO.
|
-- Initial_PO requeues its entry call to Final_PO.
|
-- Final_PO does not accept the requeued call until the protected
|
-- Final_PO does not accept the requeued call until the protected
|
-- procedure Ok_To_Take_Requeue is called.
|
-- procedure Ok_To_Take_Requeue is called.
|
-- A separate task, Delayed_Opener, is used to call Ok_To_Take_Requeue
|
-- A separate task, Delayed_Opener, is used to call Ok_To_Take_Requeue
|
-- after a delay amount specified by the main task has expired.
|
-- after a delay amount specified by the main task has expired.
|
--
|
--
|
--
|
--
|
-- CHANGE HISTORY:
|
-- CHANGE HISTORY:
|
-- 15 DEC 95 SAIC ACVC 2.1
|
-- 15 DEC 95 SAIC ACVC 2.1
|
-- 10 JUL 96 SAIC Incorporated reviewer comments.
|
-- 10 JUL 96 SAIC Incorporated reviewer comments.
|
-- 10 OCT 96 SAIC Incorporated fix provided by vendor.
|
-- 10 OCT 96 SAIC Incorporated fix provided by vendor.
|
--
|
--
|
--!
|
--!
|
|
|
with Calendar;
|
with Calendar;
|
use type Calendar.Time;
|
use type Calendar.Time;
|
with Report;
|
with Report;
|
with Impdef;
|
with Impdef;
|
procedure C954026 is
|
procedure C954026 is
|
Verbose : constant Boolean := False;
|
Verbose : constant Boolean := False;
|
Final_Po_Reached : Boolean := False;
|
Final_Po_Reached : Boolean := False;
|
Allowed_Time : constant Duration := 2.0 * Impdef.One_Long_Second;
|
Allowed_Time : constant Duration := 2.0 * Impdef.One_Long_Second;
|
Plenty_Of_Time : constant Duration :=
|
Plenty_Of_Time : constant Duration :=
|
Allowed_Time + Impdef.Clear_Ready_Queue + 1.0 * Impdef.One_Long_Second;
|
Allowed_Time + Impdef.Clear_Ready_Queue + 1.0 * Impdef.One_Long_Second;
|
Not_Enough_Time : constant Duration := Allowed_Time - 0.5 * Impdef.One_Long_Second;
|
Not_Enough_Time : constant Duration := Allowed_Time - 0.5 * Impdef.One_Long_Second;
|
begin
|
begin
|
Report.Test ("C954026",
|
Report.Test ("C954026",
|
"Check that if the original entry" &
|
"Check that if the original entry" &
|
" call was a conditional or timed entry call," &
|
" call was a conditional or timed entry call," &
|
" the expiration time for a requeue with" &
|
" the expiration time for a requeue with" &
|
" abort to a protected" &
|
" abort to a protected" &
|
" entry is the original expiration time");
|
" entry is the original expiration time");
|
declare
|
declare
|
|
|
protected Initial_Po is
|
protected Initial_Po is
|
entry Start_Here;
|
entry Start_Here;
|
end Initial_Po;
|
end Initial_Po;
|
|
|
protected Final_Po is
|
protected Final_Po is
|
entry Requeue_Target;
|
entry Requeue_Target;
|
procedure Ok_To_Take_Requeue;
|
procedure Ok_To_Take_Requeue;
|
procedure Close_Requeue;
|
procedure Close_Requeue;
|
private
|
private
|
Open : Boolean := False;
|
Open : Boolean := False;
|
end Final_Po;
|
end Final_Po;
|
|
|
-- the Delayed_Opener task is used to notify Final_PO that it can
|
-- the Delayed_Opener task is used to notify Final_PO that it can
|
-- accept the Requeue_Target entry.
|
-- accept the Requeue_Target entry.
|
task Delayed_Opener is
|
task Delayed_Opener is
|
entry Start_Timer (Amt : Duration);
|
entry Start_Timer (Amt : Duration);
|
entry Cancel_Timer;
|
entry Cancel_Timer;
|
end Delayed_Opener;
|
end Delayed_Opener;
|
|
|
task body Delayed_Opener is
|
task body Delayed_Opener is
|
Wait_Amt : Duration;
|
Wait_Amt : Duration;
|
begin
|
begin
|
loop
|
loop
|
accept Start_Timer (Amt : Duration) do
|
accept Start_Timer (Amt : Duration) do
|
Wait_Amt := Amt;
|
Wait_Amt := Amt;
|
end Start_Timer;
|
end Start_Timer;
|
exit when Wait_Amt < 0.0;
|
exit when Wait_Amt < 0.0;
|
if Verbose then
|
if Verbose then
|
Report.Comment ("Timer started");
|
Report.Comment ("Timer started");
|
end if;
|
end if;
|
select
|
select
|
accept Cancel_Timer do
|
accept Cancel_Timer do
|
Final_Po.Close_Requeue;
|
Final_Po.Close_Requeue;
|
end Cancel_Timer;
|
end Cancel_Timer;
|
or
|
or
|
delay Wait_Amt;
|
delay Wait_Amt;
|
Final_Po.Ok_To_Take_Requeue;
|
Final_Po.Ok_To_Take_Requeue;
|
accept Cancel_Timer do
|
accept Cancel_Timer do
|
Final_Po.Close_Requeue;
|
Final_Po.Close_Requeue;
|
end Cancel_Timer;
|
end Cancel_Timer;
|
end select;
|
end select;
|
end loop;
|
end loop;
|
exception
|
exception
|
when others =>
|
when others =>
|
Report.Failed ("exception in Delayed_Opener");
|
Report.Failed ("exception in Delayed_Opener");
|
end Delayed_Opener;
|
end Delayed_Opener;
|
|
|
protected body Initial_Po is
|
protected body Initial_Po is
|
entry Start_Here when True is
|
entry Start_Here when True is
|
begin
|
begin
|
Final_Po_Reached := False;
|
Final_Po_Reached := False;
|
requeue Final_Po.Requeue_Target with abort;
|
requeue Final_Po.Requeue_Target with abort;
|
end Start_Here;
|
end Start_Here;
|
end Initial_Po;
|
end Initial_Po;
|
|
|
protected body Final_Po is
|
protected body Final_Po is
|
entry Requeue_Target when Open is
|
entry Requeue_Target when Open is
|
begin
|
begin
|
Open := False;
|
Open := False;
|
Final_Po_Reached := True;
|
Final_Po_Reached := True;
|
end Requeue_Target;
|
end Requeue_Target;
|
|
|
procedure Ok_To_Take_Requeue is
|
procedure Ok_To_Take_Requeue is
|
begin
|
begin
|
Open := True;
|
Open := True;
|
end Ok_To_Take_Requeue;
|
end Ok_To_Take_Requeue;
|
|
|
procedure Close_Requeue is
|
procedure Close_Requeue is
|
begin
|
begin
|
Open := False;
|
Open := False;
|
end Close_Requeue;
|
end Close_Requeue;
|
end Final_Po;
|
end Final_Po;
|
|
|
begin -- test encapsulation
|
begin -- test encapsulation
|
-- unconditional entry call to check the simple case
|
-- unconditional entry call to check the simple case
|
Delayed_Opener.Start_Timer (0.0);
|
Delayed_Opener.Start_Timer (0.0);
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
if Verbose then
|
if Verbose then
|
Report.Comment ("simple case passed");
|
Report.Comment ("simple case passed");
|
end if;
|
end if;
|
else
|
else
|
Report.Failed ("simple case");
|
Report.Failed ("simple case");
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
|
|
-- timed but with plenty of time - delay relative
|
-- timed but with plenty of time - delay relative
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
select
|
select
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
or
|
or
|
delay Plenty_Of_Time;
|
delay Plenty_Of_Time;
|
Report.Failed ("plenty of time timed out (1)");
|
Report.Failed ("plenty of time timed out (1)");
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
Report.Failed (
|
Report.Failed (
|
"plenty of time timed out after accept (1)");
|
"plenty of time timed out after accept (1)");
|
end if;
|
end if;
|
end select;
|
end select;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
if Verbose then
|
if Verbose then
|
Report.Comment ("plenty of time case passed (1)");
|
Report.Comment ("plenty of time case passed (1)");
|
end if;
|
end if;
|
else
|
else
|
Report.Failed ("plenty of time (1)");
|
Report.Failed ("plenty of time (1)");
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
|
|
-- timed but with plenty of time -- delay until
|
-- timed but with plenty of time -- delay until
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
select
|
select
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
or
|
or
|
delay until Calendar.Clock + Plenty_Of_Time;
|
delay until Calendar.Clock + Plenty_Of_Time;
|
Report.Failed ("plenty of time timed out (2)");
|
Report.Failed ("plenty of time timed out (2)");
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
Report.Failed (
|
Report.Failed (
|
"plenty of time timed out after accept(2)");
|
"plenty of time timed out after accept(2)");
|
end if;
|
end if;
|
end select;
|
end select;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
if Verbose then
|
if Verbose then
|
Report.Comment ("plenty of time case passed (2)");
|
Report.Comment ("plenty of time case passed (2)");
|
end if;
|
end if;
|
else
|
else
|
Report.Failed ("plenty of time (2)");
|
Report.Failed ("plenty of time (2)");
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
|
|
-- timed without enough time - delay relative
|
-- timed without enough time - delay relative
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
select
|
select
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
Report.Failed ("not enough time completed accept (1)");
|
Report.Failed ("not enough time completed accept (1)");
|
or
|
or
|
delay Not_Enough_Time;
|
delay Not_Enough_Time;
|
end select;
|
end select;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
Report.Failed ("not enough time (1)");
|
Report.Failed ("not enough time (1)");
|
else
|
else
|
if Verbose then
|
if Verbose then
|
Report.Comment ("not enough time case passed (1)");
|
Report.Comment ("not enough time case passed (1)");
|
end if;
|
end if;
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
|
|
-- timed without enough time - delay until
|
-- timed without enough time - delay until
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
select
|
select
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
Report.Failed ("not enough time completed accept (2)");
|
Report.Failed ("not enough time completed accept (2)");
|
or
|
or
|
delay until Calendar.Clock + Not_Enough_Time;
|
delay until Calendar.Clock + Not_Enough_Time;
|
end select;
|
end select;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
Report.Failed ("not enough time (2)");
|
Report.Failed ("not enough time (2)");
|
else
|
else
|
if Verbose then
|
if Verbose then
|
Report.Comment ("not enough time case passed (2)");
|
Report.Comment ("not enough time case passed (2)");
|
end if;
|
end if;
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
|
|
-- conditional case
|
-- conditional case
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
Delayed_Opener.Start_Timer (Allowed_Time);
|
select
|
select
|
Initial_Po.Start_Here;
|
Initial_Po.Start_Here;
|
Report.Failed ("no time completed accept");
|
Report.Failed ("no time completed accept");
|
else
|
else
|
if Verbose then
|
if Verbose then
|
Report.Comment ("conditional case - else taken");
|
Report.Comment ("conditional case - else taken");
|
end if;
|
end if;
|
end select;
|
end select;
|
if Final_Po_Reached then
|
if Final_Po_Reached then
|
Report.Failed ("no time");
|
Report.Failed ("no time");
|
else
|
else
|
if Verbose then
|
if Verbose then
|
Report.Comment ("no time case passed");
|
Report.Comment ("no time case passed");
|
end if;
|
end if;
|
end if;
|
end if;
|
Delayed_Opener.Cancel_Timer;
|
Delayed_Opener.Cancel_Timer;
|
|
|
-- kill off the Delayed_Opener task
|
-- kill off the Delayed_Opener task
|
Delayed_Opener.Start_Timer (-10.0);
|
Delayed_Opener.Start_Timer (-10.0);
|
|
|
exception
|
exception
|
when others =>
|
when others =>
|
Report.Failed ("exception in main");
|
Report.Failed ("exception in main");
|
end;
|
end;
|
|
|
Report.Result;
|
Report.Result;
|
end C954026;
|
end C954026;
|
|
|