-- C97201X.ADA
|
-- C97201X.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 NO RENDEZVOUS CAN EVER OCCUR IF BOTH PARTNERS REFUSE TO
|
-- CHECK THAT NO RENDEZVOUS CAN EVER OCCUR IF BOTH PARTNERS REFUSE TO
|
-- WAIT (THAT IS, IF THE ENTRY CALL IS ISSUED BY A
|
-- WAIT (THAT IS, IF THE ENTRY CALL IS ISSUED BY A
|
-- "CONDITIONAL_ENTRY_CALL" AND THUS FOLLOWS A NO-WAIT POLICY
|
-- "CONDITIONAL_ENTRY_CALL" AND THUS FOLLOWS A NO-WAIT POLICY
|
-- (DEMANDING UNCONDITIONALLY THAT "YOU DO IT N O W , OR ELSE"),
|
-- (DEMANDING UNCONDITIONALLY THAT "YOU DO IT N O W , OR ELSE"),
|
-- WHILE THE CALLEE IS ALSO COMMITTED TO A NO-WAIT POLICY,
|
-- WHILE THE CALLEE IS ALSO COMMITTED TO A NO-WAIT POLICY,
|
-- BY VIRTUE OF A SELECTIVE_WAIT STATEMENT OF THE THIRD KIND
|
-- BY VIRTUE OF A SELECTIVE_WAIT STATEMENT OF THE THIRD KIND
|
-- (WITH AN "ELSE" PART) IN WHICH THE CORRESPONDING ACCEPT_STATEMENT
|
-- (WITH AN "ELSE" PART) IN WHICH THE CORRESPONDING ACCEPT_STATEMENT
|
-- IS EMBEDDED).
|
-- IS EMBEDDED).
|
-- ("CLOSE ENCOUNTERS OF THE THIRD KIND" -- ARE THEY POSSIBLE?)
|
-- ("CLOSE ENCOUNTERS OF THE THIRD KIND" -- ARE THEY POSSIBLE?)
|
|
|
|
|
-- THE SEMANTICS OF THIS ENTRY CALL REQUIRES THAT THE CALLING TASK
|
-- THE SEMANTICS OF THIS ENTRY CALL REQUIRES THAT THE CALLING TASK
|
-- N O T ENTER ITSELF ON ANY QUEUE BUT RATHER ATTEMPT AN IMMEDIATE
|
-- N O T ENTER ITSELF ON ANY QUEUE BUT RATHER ATTEMPT AN IMMEDIATE
|
-- RENDEZVOUS WHICH IS TO TAKE PLACE IF AND ONLY IF THE CALLED TASK
|
-- RENDEZVOUS WHICH IS TO TAKE PLACE IF AND ONLY IF THE CALLED TASK
|
-- HAS REACHED A POINT WHERE IT IS READY TO ACCEPT THE CALL (I.E.
|
-- HAS REACHED A POINT WHERE IT IS READY TO ACCEPT THE CALL (I.E.
|
-- IT IS EITHER WAITING AT AN ACCEPT STATEMENT FOR THE CORRESPONDING
|
-- IT IS EITHER WAITING AT AN ACCEPT STATEMENT FOR THE CORRESPONDING
|
-- ENTRY OR IT IS WAITING AT A SELECTIVE_WAIT STATEMENT WITH AN OPEN
|
-- ENTRY OR IT IS WAITING AT A SELECTIVE_WAIT STATEMENT WITH AN OPEN
|
-- ALTERNATIVE STARTING WITH SUCH AN ACCEPT STATEMENT). IT ALSO
|
-- ALTERNATIVE STARTING WITH SUCH AN ACCEPT STATEMENT). IT ALSO
|
-- REQUIRES THAT THE ENTRY CALL BE CANCELLED IF THE CALLED TASK
|
-- REQUIRES THAT THE ENTRY CALL BE CANCELLED IF THE CALLED TASK
|
-- IS NOT AT SUCH A POINT. ON THE OTHER HAND, THE SEMANTICS OF THE
|
-- IS NOT AT SUCH A POINT. ON THE OTHER HAND, THE SEMANTICS OF THE
|
-- SELECTIVE_WAIT STATEMENT WITH AN 'ELSE' PART SPECIFIES THAT
|
-- SELECTIVE_WAIT STATEMENT WITH AN 'ELSE' PART SPECIFIES THAT
|
-- THE 'ELSE' PART MUST BE SELECTED IF NO 'ACCEPT' ALTERNATIVE
|
-- THE 'ELSE' PART MUST BE SELECTED IF NO 'ACCEPT' ALTERNATIVE
|
-- CAN BE IMMEDIATELY SELECTED, AND THAT SUCH AN ALTERNATIVE
|
-- CAN BE IMMEDIATELY SELECTED, AND THAT SUCH AN ALTERNATIVE
|
-- IS DEEMED TO BE IMMEDIATELY SELECTABLE ("SELECTION OF ONE SUCH
|
-- IS DEEMED TO BE IMMEDIATELY SELECTABLE ("SELECTION OF ONE SUCH
|
-- ALTERNATIVE OCCURS IMMEDIATELY"), AND A CORRESPONDING RENDEZVOUS
|
-- ALTERNATIVE OCCURS IMMEDIATELY"), AND A CORRESPONDING RENDEZVOUS
|
-- POSSIBLE, IF AND ONLY IF THERE IS A CORRESPONDING ENTRY CALL
|
-- POSSIBLE, IF AND ONLY IF THERE IS A CORRESPONDING ENTRY CALL
|
-- W A I T I N G TO BE ACCCEPTED. A "CONDITIONAL ENTRY CALL"
|
-- W A I T I N G TO BE ACCCEPTED. A "CONDITIONAL ENTRY CALL"
|
-- NEVER WAITS, AND IS NEVER ENTERED IN WAIT QUEUES; IT TAKES
|
-- NEVER WAITS, AND IS NEVER ENTERED IN WAIT QUEUES; IT TAKES
|
-- THE 'ELSE' PART INSTEAD.
|
-- THE 'ELSE' PART INSTEAD.
|
|
|
|
|
-- NOTE: IF THIS TEST PROGRAM HANGS UP, THE COMPILER WILL BE DEEMED
|
-- NOTE: IF THIS TEST PROGRAM HANGS UP, THE COMPILER WILL BE DEEMED
|
-- TO HAVE FAILED.
|
-- TO HAVE FAILED.
|
|
|
|
|
-- RM 3/19/82
|
-- RM 3/19/82
|
|
|
|
|
WITH REPORT; USE REPORT;
|
WITH REPORT; USE REPORT;
|
PROCEDURE C97201X IS
|
PROCEDURE C97201X IS
|
|
|
RENDEZVOUS_OCCURRED : BOOLEAN := FALSE ;
|
RENDEZVOUS_OCCURRED : BOOLEAN := FALSE ;
|
|
|
CALLER_TAKES_WRONG_BRANCH : BOOLEAN := TRUE ;
|
CALLER_TAKES_WRONG_BRANCH : BOOLEAN := TRUE ;
|
SERVER_TAKES_WRONG_BRANCH : BOOLEAN := TRUE ;
|
SERVER_TAKES_WRONG_BRANCH : BOOLEAN := TRUE ;
|
QUEUE_NOT_EMPTY : BOOLEAN := FALSE ;
|
QUEUE_NOT_EMPTY : BOOLEAN := FALSE ;
|
|
|
BEGIN
|
BEGIN
|
|
|
|
|
TEST ("C97201X", "CHECK THAT NO RENDEZVOUS CAN EVER OCCUR IF" &
|
TEST ("C97201X", "CHECK THAT NO RENDEZVOUS CAN EVER OCCUR IF" &
|
" BOTH PARTNERS REFUSE TO WAIT" );
|
" BOTH PARTNERS REFUSE TO WAIT" );
|
|
|
|
|
DECLARE
|
DECLARE
|
|
|
|
|
TASK T IS
|
TASK T IS
|
ENTRY SYNCHRONIZE ;
|
ENTRY SYNCHRONIZE ;
|
ENTRY DO_IT_NOW_ORELSE( DID_YOU_DO_IT : IN OUT BOOLEAN);
|
ENTRY DO_IT_NOW_ORELSE( DID_YOU_DO_IT : IN OUT BOOLEAN);
|
ENTRY KEEP_ALIVE ;
|
ENTRY KEEP_ALIVE ;
|
END T ;
|
END T ;
|
|
|
|
|
TASK BODY T IS
|
TASK BODY T IS
|
BEGIN
|
BEGIN
|
|
|
|
|
ACCEPT SYNCHRONIZE ;
|
ACCEPT SYNCHRONIZE ;
|
|
|
|
|
IF DO_IT_NOW_ORELSE'COUNT /= 0 THEN
|
IF DO_IT_NOW_ORELSE'COUNT /= 0 THEN
|
QUEUE_NOT_EMPTY := TRUE ;
|
QUEUE_NOT_EMPTY := TRUE ;
|
END IF;
|
END IF;
|
|
|
|
|
SELECT
|
SELECT
|
ACCEPT DO_IT_NOW_ORELSE
|
ACCEPT DO_IT_NOW_ORELSE
|
( DID_YOU_DO_IT : IN OUT BOOLEAN )
|
( DID_YOU_DO_IT : IN OUT BOOLEAN )
|
DO
|
DO
|
DID_YOU_DO_IT := TRUE ;
|
DID_YOU_DO_IT := TRUE ;
|
END ;
|
END ;
|
ELSE -- (I.E. TASK ADOPTS NO-WAIT POLICY)
|
ELSE -- (I.E. TASK ADOPTS NO-WAIT POLICY)
|
-- 'ELSE' BRANCH MUST THEREFORE BE CHOSEN
|
-- 'ELSE' BRANCH MUST THEREFORE BE CHOSEN
|
SERVER_TAKES_WRONG_BRANCH := FALSE ;
|
SERVER_TAKES_WRONG_BRANCH := FALSE ;
|
END SELECT;
|
END SELECT;
|
|
|
|
|
IF DO_IT_NOW_ORELSE'COUNT /= 0 THEN
|
IF DO_IT_NOW_ORELSE'COUNT /= 0 THEN
|
QUEUE_NOT_EMPTY := TRUE ;
|
QUEUE_NOT_EMPTY := TRUE ;
|
END IF;
|
END IF;
|
|
|
|
|
ACCEPT KEEP_ALIVE ; -- TO PREVENT THIS SERVER TASK FROM
|
ACCEPT KEEP_ALIVE ; -- TO PREVENT THIS SERVER TASK FROM
|
-- TERMINATING IF IT GETS TO
|
-- TERMINATING IF IT GETS TO
|
-- THE NO-WAIT MEETING-PLACE
|
-- THE NO-WAIT MEETING-PLACE
|
-- AHEAD OF THE CALLER (WHICH
|
-- AHEAD OF THE CALLER (WHICH
|
-- WOULD LEAD TO A SUBSEQUENT
|
-- WOULD LEAD TO A SUBSEQUENT
|
-- TASKING_ERROR AT THE TIME OF
|
-- TASKING_ERROR AT THE TIME OF
|
-- THE NO-WAIT CALL).
|
-- THE NO-WAIT CALL).
|
|
|
|
|
END T ;
|
END T ;
|
|
|
|
|
BEGIN
|
BEGIN
|
|
|
|
|
T.SYNCHRONIZE ; -- TO MINIMIZE THE N E E D TO WAIT
|
T.SYNCHRONIZE ; -- TO MINIMIZE THE N E E D TO WAIT
|
|
|
|
|
SELECT
|
SELECT
|
T.DO_IT_NOW_ORELSE ( RENDEZVOUS_OCCURRED );
|
T.DO_IT_NOW_ORELSE ( RENDEZVOUS_OCCURRED );
|
ELSE -- (I.E. CALLER TOO ADOPTS A NO-WAIT POLICY)
|
ELSE -- (I.E. CALLER TOO ADOPTS A NO-WAIT POLICY)
|
-- MUST THEREFORE CHOOSE THIS BRANCH
|
-- MUST THEREFORE CHOOSE THIS BRANCH
|
CALLER_TAKES_WRONG_BRANCH := FALSE ;
|
CALLER_TAKES_WRONG_BRANCH := FALSE ;
|
END SELECT;
|
END SELECT;
|
|
|
|
|
T.KEEP_ALIVE ; -- THIS ALSO UPDATES THE NONLOCALS
|
T.KEEP_ALIVE ; -- THIS ALSO UPDATES THE NONLOCALS
|
|
|
|
|
END; -- END OF BLOCK CONTAINING THE NO-WAIT ENTRY CALL
|
END; -- END OF BLOCK CONTAINING THE NO-WAIT ENTRY CALL
|
|
|
|
|
IF RENDEZVOUS_OCCURRED
|
IF RENDEZVOUS_OCCURRED
|
THEN
|
THEN
|
FAILED( "RENDEZVOUS OCCURRED" );
|
FAILED( "RENDEZVOUS OCCURRED" );
|
END IF;
|
END IF;
|
|
|
IF CALLER_TAKES_WRONG_BRANCH OR
|
IF CALLER_TAKES_WRONG_BRANCH OR
|
SERVER_TAKES_WRONG_BRANCH
|
SERVER_TAKES_WRONG_BRANCH
|
THEN
|
THEN
|
FAILED( "WRONG BRANCH TAKEN" );
|
FAILED( "WRONG BRANCH TAKEN" );
|
END IF;
|
END IF;
|
|
|
IF QUEUE_NOT_EMPTY
|
IF QUEUE_NOT_EMPTY
|
THEN
|
THEN
|
FAILED( "ENTRY QUEUE NOT EMPTY" );
|
FAILED( "ENTRY QUEUE NOT EMPTY" );
|
END IF;
|
END IF;
|
|
|
|
|
RESULT;
|
RESULT;
|
|
|
|
|
END C97201X ;
|
END C97201X ;
|
|
|