-- C9A007A.ADA
|
-- C9A007A.ADA
|
|
|
-- 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.
|
--*
|
--*
|
-- CHECK THAT A TASK MAY ABORT A TASK IT DEPENDS ON.
|
-- CHECK THAT A TASK MAY ABORT A TASK IT DEPENDS ON.
|
|
|
|
|
-- RM 5/26/82
|
-- RM 5/26/82
|
-- RM 7/02/82
|
-- RM 7/02/82
|
-- SPS 11/21/82
|
-- SPS 11/21/82
|
-- JBG 2/27/84
|
-- JBG 2/27/84
|
-- JBG 3/8/84
|
-- JBG 3/8/84
|
-- PWN 11/30/94 REMOVED PRAGMA PRIORITY INSTANCES FOR ADA 9X.
|
-- PWN 11/30/94 REMOVED PRAGMA PRIORITY INSTANCES FOR ADA 9X.
|
-- EDS 08/04/98 ENSURE THAT ABORTED TASKS HAVE TIME TO EFFECT THEIR ABORTIONS.
|
-- EDS 08/04/98 ENSURE THAT ABORTED TASKS HAVE TIME TO EFFECT THEIR ABORTIONS.
|
|
|
WITH IMPDEF;
|
WITH IMPDEF;
|
WITH REPORT; USE REPORT;
|
WITH REPORT; USE REPORT;
|
WITH SYSTEM; USE SYSTEM;
|
WITH SYSTEM; USE SYSTEM;
|
PROCEDURE C9A007A IS
|
PROCEDURE C9A007A IS
|
|
|
TASK_NOT_ABORTED : BOOLEAN := FALSE;
|
TASK_NOT_ABORTED : BOOLEAN := FALSE;
|
TEST_VALID : BOOLEAN := TRUE ;
|
TEST_VALID : BOOLEAN := TRUE ;
|
|
|
BEGIN
|
BEGIN
|
|
|
|
|
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
|
|
|
|
TEST ( "C9A007A" , "CHECK THAT A TASK MAY ABORT A TASK" &
|
TEST ( "C9A007A" , "CHECK THAT A TASK MAY ABORT A TASK" &
|
" IT DEPENDS ON" );
|
" IT DEPENDS ON" );
|
|
|
|
|
DECLARE
|
DECLARE
|
|
|
|
|
TASK REGISTER IS
|
TASK REGISTER IS
|
|
|
|
|
ENTRY BIRTHS_AND_DEATHS;
|
ENTRY BIRTHS_AND_DEATHS;
|
|
|
ENTRY SYNC1;
|
ENTRY SYNC1;
|
ENTRY SYNC2;
|
ENTRY SYNC2;
|
|
|
|
|
END REGISTER;
|
END REGISTER;
|
|
|
|
|
TASK BODY REGISTER IS
|
TASK BODY REGISTER IS
|
|
|
|
|
TASK TYPE SECONDARY IS
|
TASK TYPE SECONDARY IS
|
|
|
|
|
ENTRY WAIT_INDEFINITELY;
|
ENTRY WAIT_INDEFINITELY;
|
|
|
END SECONDARY;
|
END SECONDARY;
|
|
|
|
|
TASK TYPE T_TYPE1 IS
|
TASK TYPE T_TYPE1 IS
|
|
|
|
|
ENTRY E;
|
ENTRY E;
|
|
|
END T_TYPE1;
|
END T_TYPE1;
|
|
|
|
|
TASK TYPE T_TYPE2 IS
|
TASK TYPE T_TYPE2 IS
|
|
|
|
|
ENTRY E;
|
ENTRY E;
|
|
|
END T_TYPE2;
|
END T_TYPE2;
|
|
|
|
|
T_OBJECT1 : T_TYPE1;
|
T_OBJECT1 : T_TYPE1;
|
T_OBJECT2 : T_TYPE2;
|
T_OBJECT2 : T_TYPE2;
|
|
|
|
|
TASK BODY SECONDARY IS
|
TASK BODY SECONDARY IS
|
BEGIN
|
BEGIN
|
SYNC1;
|
SYNC1;
|
ABORT T_OBJECT1;
|
ABORT T_OBJECT1;
|
DELAY 0.0;
|
DELAY 0.0;
|
TASK_NOT_ABORTED := TRUE;
|
TASK_NOT_ABORTED := TRUE;
|
END SECONDARY;
|
END SECONDARY;
|
|
|
|
|
TASK BODY T_TYPE1 IS
|
TASK BODY T_TYPE1 IS
|
|
|
TYPE ACCESS_TO_TASK IS ACCESS SECONDARY;
|
TYPE ACCESS_TO_TASK IS ACCESS SECONDARY;
|
|
|
BEGIN
|
BEGIN
|
|
|
|
|
DECLARE
|
DECLARE
|
DEPENDENT_BY_ACCESS : ACCESS_TO_TASK :=
|
DEPENDENT_BY_ACCESS : ACCESS_TO_TASK :=
|
NEW SECONDARY ;
|
NEW SECONDARY ;
|
BEGIN
|
BEGIN
|
NULL;
|
NULL;
|
END;
|
END;
|
|
|
|
|
BIRTHS_AND_DEATHS;
|
BIRTHS_AND_DEATHS;
|
-- DURING THIS SUSPENSION
|
-- DURING THIS SUSPENSION
|
-- MOST OF THE TASKS
|
-- MOST OF THE TASKS
|
-- ARE ABORTED (FIRST
|
-- ARE ABORTED (FIRST
|
-- TASK #1 -- T_OBJECT1 --
|
-- TASK #1 -- T_OBJECT1 --
|
-- THEN #2 ).
|
-- THEN #2 ).
|
|
|
|
|
TASK_NOT_ABORTED := TRUE;
|
TASK_NOT_ABORTED := TRUE;
|
|
|
|
|
END T_TYPE1;
|
END T_TYPE1;
|
|
|
|
|
TASK BODY T_TYPE2 IS
|
TASK BODY T_TYPE2 IS
|
|
|
TASK INNER_TASK IS
|
TASK INNER_TASK IS
|
|
|
|
|
ENTRY WAIT_INDEFINITELY;
|
ENTRY WAIT_INDEFINITELY;
|
|
|
END INNER_TASK;
|
END INNER_TASK;
|
|
|
TASK BODY INNER_TASK IS
|
TASK BODY INNER_TASK IS
|
BEGIN
|
BEGIN
|
SYNC2;
|
SYNC2;
|
ABORT T_OBJECT2;
|
ABORT T_OBJECT2;
|
DELAY 0.0;
|
DELAY 0.0;
|
TASK_NOT_ABORTED := TRUE;
|
TASK_NOT_ABORTED := TRUE;
|
END INNER_TASK;
|
END INNER_TASK;
|
|
|
BEGIN
|
BEGIN
|
|
|
|
|
BIRTHS_AND_DEATHS;
|
BIRTHS_AND_DEATHS;
|
-- DURING THIS SUSPENSION
|
-- DURING THIS SUSPENSION
|
-- MOST OF THE TASKS
|
-- MOST OF THE TASKS
|
-- ARE ABORTED (FIRST
|
-- ARE ABORTED (FIRST
|
-- TASK #1 -- T_OBJECT1 --
|
-- TASK #1 -- T_OBJECT1 --
|
-- THEN #2 ).
|
-- THEN #2 ).
|
|
|
|
|
TASK_NOT_ABORTED := TRUE;
|
TASK_NOT_ABORTED := TRUE;
|
|
|
|
|
END T_TYPE2;
|
END T_TYPE2;
|
|
|
|
|
BEGIN
|
BEGIN
|
|
|
DECLARE
|
DECLARE
|
OLD_COUNT : INTEGER := 0;
|
OLD_COUNT : INTEGER := 0;
|
BEGIN
|
BEGIN
|
|
|
|
|
FOR I IN 1..5 LOOP
|
FOR I IN 1..5 LOOP
|
EXIT WHEN BIRTHS_AND_DEATHS'COUNT = 2;
|
EXIT WHEN BIRTHS_AND_DEATHS'COUNT = 2;
|
DELAY 10.0 * Impdef.One_Second;
|
DELAY 10.0 * Impdef.One_Second;
|
END LOOP;
|
END LOOP;
|
|
|
OLD_COUNT := BIRTHS_AND_DEATHS'COUNT;
|
OLD_COUNT := BIRTHS_AND_DEATHS'COUNT;
|
|
|
IF OLD_COUNT = 2 THEN
|
IF OLD_COUNT = 2 THEN
|
|
|
ACCEPT SYNC1; -- ALLOWING ABORT#1
|
ACCEPT SYNC1; -- ALLOWING ABORT#1
|
|
|
DELAY IMPDEF.CLEAR_READY_QUEUE;
|
DELAY IMPDEF.CLEAR_READY_QUEUE;
|
|
|
-- CHECK THAT #1 WAS ABORTED - 3 WAYS:
|
-- CHECK THAT #1 WAS ABORTED - 3 WAYS:
|
|
|
BEGIN
|
BEGIN
|
T_OBJECT1.E;
|
T_OBJECT1.E;
|
FAILED( "T_OBJECT1.E DID NOT RAISE" &
|
FAILED( "T_OBJECT1.E DID NOT RAISE" &
|
" TASKING_ERROR" );
|
" TASKING_ERROR" );
|
EXCEPTION
|
EXCEPTION
|
|
|
WHEN TASKING_ERROR =>
|
WHEN TASKING_ERROR =>
|
NULL;
|
NULL;
|
|
|
WHEN OTHERS =>
|
WHEN OTHERS =>
|
FAILED("OTHER EXCEPTION RAISED - 1");
|
FAILED("OTHER EXCEPTION RAISED - 1");
|
|
|
END;
|
END;
|
|
|
IF T_OBJECT1'CALLABLE THEN
|
IF T_OBJECT1'CALLABLE THEN
|
FAILED( "T_OBJECT1'CALLABLE = TRUE" );
|
FAILED( "T_OBJECT1'CALLABLE = TRUE" );
|
END IF;
|
END IF;
|
|
|
IF OLD_COUNT - BIRTHS_AND_DEATHS'COUNT /= 1
|
IF OLD_COUNT - BIRTHS_AND_DEATHS'COUNT /= 1
|
THEN
|
THEN
|
FAILED( "TASK#1 NOT REMOVED FROM QUEUE" );
|
FAILED( "TASK#1 NOT REMOVED FROM QUEUE" );
|
END IF;
|
END IF;
|
|
|
|
|
OLD_COUNT := BIRTHS_AND_DEATHS'COUNT;
|
OLD_COUNT := BIRTHS_AND_DEATHS'COUNT;
|
|
|
|
|
ACCEPT SYNC2; -- ALLOWING ABORT#2
|
ACCEPT SYNC2; -- ALLOWING ABORT#2
|
|
|
DELAY IMPDEF.CLEAR_READY_QUEUE;
|
DELAY IMPDEF.CLEAR_READY_QUEUE;
|
|
|
-- CHECK THAT #2 WAS ABORTED - 3 WAYS:
|
-- CHECK THAT #2 WAS ABORTED - 3 WAYS:
|
|
|
BEGIN
|
BEGIN
|
T_OBJECT2.E;
|
T_OBJECT2.E;
|
FAILED( "T_OBJECT2.E DID NOT RAISE" &
|
FAILED( "T_OBJECT2.E DID NOT RAISE" &
|
" TASKING_ERROR" );
|
" TASKING_ERROR" );
|
EXCEPTION
|
EXCEPTION
|
|
|
WHEN TASKING_ERROR =>
|
WHEN TASKING_ERROR =>
|
NULL;
|
NULL;
|
|
|
WHEN OTHERS =>
|
WHEN OTHERS =>
|
FAILED("OTHER EXCEPTION RAISED - 2");
|
FAILED("OTHER EXCEPTION RAISED - 2");
|
|
|
END;
|
END;
|
|
|
IF T_OBJECT2'CALLABLE THEN
|
IF T_OBJECT2'CALLABLE THEN
|
FAILED( "T_OBJECT2'CALLABLE = TRUE" );
|
FAILED( "T_OBJECT2'CALLABLE = TRUE" );
|
END IF;
|
END IF;
|
|
|
IF OLD_COUNT - BIRTHS_AND_DEATHS'COUNT /= 1
|
IF OLD_COUNT - BIRTHS_AND_DEATHS'COUNT /= 1
|
THEN
|
THEN
|
FAILED( "TASK#2 NOT REMOVED FROM QUEUE" );
|
FAILED( "TASK#2 NOT REMOVED FROM QUEUE" );
|
END IF;
|
END IF;
|
|
|
|
|
IF BIRTHS_AND_DEATHS'COUNT /= 0 THEN
|
IF BIRTHS_AND_DEATHS'COUNT /= 0 THEN
|
FAILED( "SOME TASKS STILL QUEUED" );
|
FAILED( "SOME TASKS STILL QUEUED" );
|
END IF;
|
END IF;
|
|
|
|
|
ELSE
|
ELSE
|
|
|
COMMENT( "LINEUP NOT COMPLETE (AFTER 50 S.)" );
|
COMMENT( "LINEUP NOT COMPLETE (AFTER 50 S.)" );
|
TEST_VALID := FALSE;
|
TEST_VALID := FALSE;
|
|
|
END IF;
|
END IF;
|
|
|
|
|
END;
|
END;
|
|
|
|
|
WHILE BIRTHS_AND_DEATHS'COUNT > 0 LOOP
|
WHILE BIRTHS_AND_DEATHS'COUNT > 0 LOOP
|
ACCEPT BIRTHS_AND_DEATHS;
|
ACCEPT BIRTHS_AND_DEATHS;
|
END LOOP;
|
END LOOP;
|
|
|
|
|
END REGISTER;
|
END REGISTER;
|
|
|
|
|
BEGIN
|
BEGIN
|
|
|
NULL;
|
NULL;
|
|
|
END;
|
END;
|
|
|
|
|
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
|
|
|
|
IF TEST_VALID AND TASK_NOT_ABORTED THEN
|
IF TEST_VALID AND TASK_NOT_ABORTED THEN
|
FAILED( "SOME TASKS NOT ABORTED" );
|
FAILED( "SOME TASKS NOT ABORTED" );
|
END IF;
|
END IF;
|
|
|
|
|
RESULT;
|
RESULT;
|
|
|
|
|
END C9A007A;
|
END C9A007A;
|
|
|