with Impdef;
WITH REPORT; USE REPORT;
WITH SYSTEM; USE SYSTEM;
PROCEDURE C94001A IS
MY_EXCEPTION : EXCEPTION;
GLOBAL : INTEGER;
TASK TYPE TT IS
ENTRY E (I : INTEGER);
END TT;
TASK BODY TT IS
LOCAL : INTEGER;
BEGIN
ACCEPT E (I : INTEGER) DO
LOCAL := I;
END E;
DELAY 30.0 * Impdef.One_Second; GLOBAL := LOCAL;
END TT;
BEGIN
TEST ("C94001A", "CHECK THAT A UNIT WITH DEPENDENT TASKS " &
"CREATED BY OBJECT DECLARATIONS IS NOT " &
"TERMINATED UNTIL ALL DEPENDENT TASKS " &
"BECOME TERMINATED");
GLOBAL := IDENT_INT (0);
DECLARE
T : TT;
BEGIN
T.E (IDENT_INT(1));
END;
IF GLOBAL /= 1 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"BLOCK EXIT - 1");
END IF;
GLOBAL := IDENT_INT (0);
BEGIN DECLARE
T : TT;
BEGIN
T.E (IDENT_INT(1));
RAISE MY_EXCEPTION;
END;
FAILED ("MY_EXCEPTION WAS NOT RAISED - 2");
EXCEPTION
WHEN MY_EXCEPTION =>
IF GLOBAL /= 1 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"BLOCK EXIT - 2");
END IF;
WHEN OTHERS =>
FAILED ("UNEXPECTED EXCEPTION - 2");
END;
GLOBAL := IDENT_INT (0);
DECLARE
I : INTEGER;
FUNCTION F RETURN INTEGER IS
A : ARRAY (1..1) OF TT;
BEGIN
A(1).E (IDENT_INT(2));
RETURN 0;
END F;
BEGIN
I := F;
IF GLOBAL /= 2 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"FUNCTION EXIT - 3");
END IF;
END;
GLOBAL := IDENT_INT (0);
DECLARE
I : INTEGER;
FUNCTION F RETURN INTEGER IS
A : ARRAY (1..1) OF TT;
BEGIN
A(1).E (IDENT_INT(2));
IF EQUAL (3, 3) THEN
RAISE MY_EXCEPTION;
END IF;
RETURN 0;
END F;
BEGIN I := F;
FAILED ("MY_EXCEPTION WAS NOT RAISED - 4");
EXCEPTION
WHEN MY_EXCEPTION =>
IF GLOBAL /= 2 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"FUNCTION EXIT - 4");
END IF;
WHEN OTHERS =>
FAILED ("UNEXPECTED EXCEPTION - 4");
END;
GLOBAL := IDENT_INT (0);
DECLARE
LOOP_COUNT : INTEGER := 0;
CUT_OFF : CONSTANT := 60 * 60;
TASK TSK IS
ENTRY ENT;
END TSK;
TASK BODY TSK IS
TYPE RT IS
RECORD
T : TT;
END RECORD;
AR : ARRAY (1..1) OF RT;
BEGIN
AR(1).T.E (IDENT_INT(3));
END TSK;
BEGIN
WHILE NOT TSK'TERMINATED AND LOOP_COUNT < CUT_OFF LOOP
DELAY 1.0 * Impdef.One_Second;
LOOP_COUNT := LOOP_COUNT + 1;
END LOOP;
IF LOOP_COUNT >= CUT_OFF THEN
FAILED ("DEPENDENT TASK NOT TERMINATED WITHIN ONE " &
"HOUR - 5");
ELSIF GLOBAL /= 3 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"TASK EXIT - 5");
END IF;
END;
GLOBAL := IDENT_INT (0);
DECLARE
LOOP_COUNT : INTEGER := 0;
CUT_OFF : CONSTANT := 60 * 60;
TASK TSK IS
ENTRY ENT;
END TSK;
TASK BODY TSK IS
TYPE RT IS
RECORD
T : TT;
END RECORD;
AR : ARRAY (1..1) OF RT;
BEGIN
AR(1).T.E (IDENT_INT(3));
IF EQUAL (3, 3) THEN
RAISE MY_EXCEPTION;
END IF;
FAILED ("EXCEPTION WAS NOT RAISED - 6");
END TSK;
BEGIN
WHILE NOT TSK'TERMINATED AND LOOP_COUNT < CUT_OFF LOOP
DELAY 1.0 * Impdef.One_Second;
LOOP_COUNT := LOOP_COUNT + 1;
END LOOP;
IF LOOP_COUNT >= CUT_OFF THEN
FAILED ("DEPENDENT TASK NOT TERMINATED WITHIN ONE " &
"HOUR - 6");
ELSIF GLOBAL /= 3 THEN
FAILED ("DEPENDENT TASK NOT TERMINATED BEFORE " &
"TASK EXIT - 6");
END IF;
END;
RESULT;
END C94001A;