c95021a.ada

来自「linux下编程用 编译软件」· ADA 代码 · 共 183 行

ADA
183
字号
-- C95021A.ADA--                             Grant of Unlimited Rights----     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 --     unlimited rights in the software and documentation contained herein.--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making --     this public release, the Government intends to confer upon all --     recipients unlimited rights  equal to those held by the Government.  --     These rights include rights to use, duplicate, release or disclose the --     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 --     to do so.----                                    DISCLAIMER----     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED --     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE --     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A--     PARTICULAR PURPOSE OF SAID MATERIAL.--*-- CHECK THAT CALLS TO AN ENTRY ARE PLACED IN A FIFO QUEUE.-- JBG 2/22/84-- DAS 10/8/90  ADDED PRAGMA PRIORITY TO ENSURE THAT THE FIFO--              DISCIPLINE MUST BE FOLLOWED (OTHERWISE THE--              IMPLEMENTATION MIGHT PROHIBIT QUEUES FROM--              FORMING SO THAT E'COUNT IS ALWAYS ZERO FOR--              AN ENTRY E).-- PWN 11/30/94 REMOVED PRAGMA PRIORITY INSTANCES FOR ADA 9X.-- THE TASK QUEUE IS THE TASK THAT CHECKS THE QUEUEING DISCIPLINE.---- THIS TEST PLACES TWO CALLS ON AN ENTRY, WAITS UNTIL ONE OF THE CALLS-- IS ACCEPTED, AND THEN PLACES A THIRD CALL ON THE ENTRY.  THE TEST-- CHECKS THAT THE SECOND CALL IS HANDLED BEFORE THE THIRD.  (IT IS-- NONDETERMINISTIC WHICH CALL WILL BE THE FIRST ONE ON THE QUEUE, SO-- THIS MORE COMPLICATED APPROACH IS NECESSARY.)---- THE TASK DISPATCH FIRES UP THE TWO TASKS THAT MAKE THE FIRST TWO-- CALLS AND THEN WAITS UNTIL QUEUE SAYS IT IS READY FOR THE THIRD CALL.---- THE TASK TYPE CALLERS IS USED TO CREATE TASKS THAT WILL CALL THE-- ENTRY IN THE TASK QUEUE.with Impdef;WITH REPORT; USE REPORT;WITH SYSTEM;PROCEDURE C95021A ISBEGIN     TEST ("C95021A", "CHECK THAT ENTRY CALLS ARE PUT IN FIFO QUEUES");-- DO THIS TEST 3 TIMES TO ALLOW FOR RANDOM VARIATIONS IN TIMING.     FOR I IN 1..3 LOOP            COMMENT ("ITERATION" & INTEGER'IMAGE(I));     DECLARE          TASK TYPE CALLERS IS               ENTRY NAME (N : NATURAL);          END CALLERS;          TASK QUEUE IS               ENTRY GO;               ENTRY E1 (NAME : NATURAL);          END QUEUE;          TASK DISPATCH IS               ENTRY READY;          END DISPATCH;          TASK BODY CALLERS IS               MY_NAME : NATURAL;          BEGIN-- GET NAME OF THIS TASK OBJECT               ACCEPT NAME (N : NATURAL) DO                    MY_NAME := N;               END NAME;-- PUT THIS TASK ON QUEUE FOR QUEUE.E1               QUEUE.E1 (MY_NAME);          END CALLERS;          TASK BODY DISPATCH IS               TYPE ACC_CALLERS IS ACCESS CALLERS;               OBJ : ACC_CALLERS;          BEGIN-- FIRE UP TWO CALLERS FOR QUEUE.E1               OBJ := NEW CALLERS;               OBJ.NAME(1);               OBJ := NEW CALLERS;               OBJ.NAME(2);-- ALLOW THESE CALLS TO BE PROCESSED (ONLY ONE WILL BE ACCEPTED).               QUEUE.GO;-- WAIT TILL ONE CALL HAS BEEN PROCESSED.               ACCEPT READY;       -- CALLED FROM QUEUE-- FIRE UP THIRD CALLER               OBJ := NEW CALLERS;               OBJ.NAME(3);          END DISPATCH;          TASK BODY QUEUE IS               NEXT : NATURAL;     -- NUMBER OF SECOND CALLER IN QUEUE.          BEGIN-- WAIT UNTIL TWO TASKS CALLING E1 HAVE BEEN ACTIVATED.               ACCEPT GO;-- WAIT FOR TWO CALLS TO BE AVAILABLE.  THIS WAIT ASSUMES THAT THE-- CALLER TASKS WILL PROCEED IF THIS TASK IS EXECUTING A DELAY-- STATEMENT, ALTHOUGH THIS IS NOT STRICTLY REQUIRED BY THE STANDARD.               FOR I IN 1..6       -- WILL WAIT FOR ONE MINUTE               LOOP                    EXIT WHEN E1'COUNT = 2;                    DELAY 10.0 * Impdef.One_Second;    -- WAIT FOR CALLS TO ARRIVE               END LOOP;               IF E1'COUNT /= 2 THEN                    FAILED ("CALLER TASKS NOT QUEUED AFTER ONE " &                            "MINUTE - 1");               END IF;-- ASSUMING NO FAILURE, PROCESS ONE OF THE QUEUED CALLS.               ACCEPT E1 (NAME : NATURAL) DO-- GET NAME OF NEXT CALLER                    CASE NAME IS                         WHEN 1 =>                               NEXT := 2;                         WHEN 2 =>                               NEXT := 1;                         WHEN OTHERS =>                               FAILED ("UNEXPECTED ERROR");                    END CASE;               END E1;-- TELL DISPATCH TO FIRE UP NEXT CALLER (ONE IS STILL IN QUEUE).               DISPATCH.READY;-- WAIT FOR CALL TO ARRIVE.               FOR I IN 1..6       -- WILL WAIT FOR ONE MINUTE               LOOP                    EXIT WHEN E1'COUNT = 2;                    DELAY 10.0 * Impdef.One_Second;    -- WAIT FOR CALLS TO ARRIVE               END LOOP;               IF E1'COUNT /= 2 THEN                    FAILED ("CALLER TASKS NOT QUEUED AFTER ONE " &                            "MINUTE - 2");               END IF;-- ASSUMING NO FAILURE, ACCEPT SECOND CALL AND CHECK THAT IT IS FROM THE-- CORRECT TASK.               ACCEPT E1 (NAME : NATURAL) DO                    IF NAME /= NEXT THEN                         FAILED ("FIFO DISCIPLINE NOT OBEYED");                    END IF;               END E1;-- ACCEPT THE LAST CALLER               ACCEPT E1 (NAME : NATURAL);          END QUEUE;     BEGIN          NULL;     END;           -- ALL TASKS NOW TERMINATED.     END LOOP;     RESULT;END C95021A;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?