DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T V ┃
Length: 12526 (0x30ee) Types: TextFile Names: »V«
└─⟦516dceb10⟧ Bits:30000751 8mm tape, Rational 1000, RCI_VADS └─ ⟦9a14c9417⟧ »DATA« └─⟦this⟧
with V_Interrupts; generic type Message_Type is private; package V_Mailboxes is pragma Suppress (All_Checks); -- PURPOSE : V_MAILBOXES is a generic package which provides mailbox -- operations. Mailboxes may be used for unsyncronized -- passing of data between tasks, or between an interrupt -- handler and a task. -- -- The operation CREATE_MAILBOX creates a mailbox for -- passing objects of the type used to instantiate the -- generic package. -- -- READ_MAILBOX reads messages from a mailbox in a first-in- -- first-out basis. A parameter may be used to specify how -- long the task is willing to wait for a message, if one is -- not immediately available. Waiting tasks are queued on -- the mailbox in priority order (as specified by pragma -- PRIORITY), and first-in-first-out within priorities. -- -- WRITE_MAILBOX writes a message to the mailbox, awakening a -- task waiting on the mailbox, if any are waiting. -- -- CURRENT_MESSAGE_COUNT returns the number of unread messages -- in the mailbox. -- -- DELETE_MAILBOX deletes a mailbox. The user must specify -- the action to be taken if there are currently tasks -- waiting on the mailbox. -- -- WHERE : MESSAGE_TYPE is the type of object which may be passed -- using the operations provided by an instantiation. -- -- EXAMPLE : The following declaration creates a package providing -- operations to pass characters via mailboxes. -- -- package CHAR_BOX is new V_MAILBOXES -- (MESSAGE_TYPE => CHARACTER); -- -- The following declaration creates a package providing -- signal operations via mailboxes (ie messages of null -- length). -- -- type signal_t is array(integer 1..0) of integer; -- package signal is new V_MAILBOXES(MESSAGE_TYPE => signal_t); -- The following type is used to identify mailboxes. type Mailbox_Id is private; -- Objects of the following type are used to specify the action to -- take during a call to DELETE_MAILBOX if tasks are waiting on the -- mailbox that is to be deleted. type Mailbox_Delete_Option is (Delete_Option_Force, Delete_Option_Warning); -- Where: -- DELETE_OPTION_FORCE delete the mailbox even though -- there may be tasks waiting at the -- mailbox. -- -- DELETE_OPTION_WARNING indicates that the mailbox should -- only be deleted if there are no -- waiting tasks. -- The following constants may be used with READ_MAILBOX to specify -- that the mailbox either should either be waited on indefinitely -- or not at all, respectively. Wait_Forever : constant Duration := -1.0; Do_Not_Wait : constant Duration := 0.0; -- The following exceptions may be raised by the mailbox services: No_Memory_For_Mailbox : exception; -- NO_MEMORY_FOR_MAILBOX is raised by CREATE_MAILBOX if there was not -- sufficient memory available to create the mailbox. Invalid_Mailbox : exception; -- INVALID_MAILBOX is raised if the mailbox id passed to a mailbox -- operation does not identify an existing mailbox. Mailbox_Timed_Out : exception; -- MAILBOX_TIMED_OUT is raised by READ_MAILBOX if a timed wait was -- performed and a message did not arrive in the specified time -- interval. Mailbox_Empty : exception; -- MAILBOX_EMPTY is raised by READ_MAILBOX if an unwaited read was -- performed and there was not a message in the mailbox. Mailbox_Deleted : exception; -- MAILBOX_DELETED is raised by READ_MAILBOX if the mailbox was -- deleted during the read operation. Mailbox_Full : exception; -- MAILBOX_FULL is raised by WRITE_MAILBOX if an attempt was made to -- write to a full mailbox. Mailbox_Not_Empty : exception; -- MAILBOX_NOT_EMPTY is raised by DELETE_MAILBOX if an attempt was -- made to delete a non-empty mailbox and the delete option was -- delete_option_warning. Mailbox_In_Use : exception; -- MAILBOX_IN_USE is raised by DELETE_MAILBOX if an attempt was -- made to delete a mailbox on which a task was waiting and the -- delete option was delete_option_warning. Unexpected_V_Mailbox_Error : exception; -- UNEXPECTED_V_MAILBOX_ERROR may be raised if an unexpected -- error occurs during a V_MAILBOX operation. -- The following type declares the result codes which may be returned -- by the non-exception-raising versions of the READ_MAILBOX and -- WRITE_MAILBOX routines. type Mailbox_Result is (Sent, Received, Timed_Out, Full, Empty, Deleted); -- READ_MAILBOX returns RECEIVED if the message was received, -- TIMED_OUT if a timed wait was performed and a message did -- not arrive in the specified interval, EMPTY if a non-waited -- read was performed and the mailbox was EMPTY, or DELETED if -- the mailbox was deleted while the current task was waiting -- on it. -- -- WRITE_MAILBOX returns SENT if the message was sent, or FULL -- if the message could not be sent because the mailbox was -- full. procedure Create_Mailbox (Numberslots : in Positive := 1; Mailbox : out Mailbox_Id; Interrupt_Flag : in Boolean := False; Interrupt_Status : in V_Interrupts.Interrupt_Status_T := V_Interrupts.Disable_Interrupt); function Create_Mailbox (Numberslots : in Positive := 1; Interrupt_Flag : in Boolean := False; Interrupt_Status : in V_Interrupts.Interrupt_Status_T := V_Interrupts.Disable_Interrupt) return Mailbox_Id; -- Purpose: CREATE_MAILBOX creates and initializes a mailbox. -- Two versions are supplied for doing the create, -- a procedure that returns mailbox id as an out parameter or -- a function returning the mailbox id. -- -- Where: -- -- numberslots indicates the number of slots to have in the -- mailbox. -- -- mailbox identifies the mailbox created. -- -- interrupt_flag normally, a mailbox's critical region is protected -- by a binary semaphore. However, if INTERRUPT_FLAG -- is TRUE, then its critical region is protected by -- disabling interrupts using the INTERRUPT_STATUS -- parameter. INTERRUPT_FLAG must be set to TRUE if -- the mailbox is accessed from an ISR. -- Defaults to FALSE. -- -- interrupt_status if above INTERRUPT_FLAG is TRUE, then this value -- is used to disable interrupts. Defaults to -- disabling all interrupt levels. -- -- Exceptions: -- -- NO_MEMORY_FOR_MAILBOX is raised if there was not sufficient -- memory available to create the mailbox. procedure Read_Mailbox (Mailbox : in Mailbox_Id; Waittime : in Duration; Message : out Message_Type); procedure Read_Mailbox (Mailbox : in Mailbox_Id; Waittime : in Duration; Message : out Message_Type; Result : out Mailbox_Result); -- Purpose: READ_MAILBOX retrieves a message from a mailbox. -- -- If READ_MAILBOX is called from an interrupt -- service routine then waittime should be set to -- DO_NOT_WAIT. -- -- Where: -- -- mailbox identifies the mailbox to be read. -- -- waittime indicates the time the caller wishes to -- wait (in seconds) for the read to -- complete. A value of WAIT_FOREVER -- indicates the caller will wait forever -- for a message. -- -- message is the message retrieved from the mailbox. -- -- Exceptions/Results: -- -- INVALID_MAILBOX is raised if the mailbox id does not identify -- an existing mailbox. -- -- MAILBOX_TIMED_OUT is raised (or the result value TIMED_OUT is -- returned) if a timed wait was performed and a message did not -- arrive in the specified time interval. -- -- MAILBOX_EMPTY is raised (or the result value EMPTY is returned) -- if an unwaited read was performed and there was not a message -- in the mailbox. -- -- MAILBOX_DELETED is raised (or the result value DELETED is returned) -- if the mailbox was deleted during the read operation. -- -- The result value RECEIVED is returned if a message is read. procedure Write_Mailbox (Mailbox : in Mailbox_Id; Message : in Message_Type); procedure Write_Mailbox (Mailbox : in Mailbox_Id; Message : in Message_Type; Result : out Mailbox_Result); -- Purpose: WRITE_MAILBOX writes a message into a mailbox. -- -- Where: -- -- mailbox identifies the mailbox to write to. -- -- message is the message to write into the mailbox. -- -- Exceptions/Results: -- -- INVALID_MAILBOX is raised if the mailbox id does not identify -- an existing mailbox. -- -- MAILBOX_FULL is raised (or the result value FULL is returned) -- if an attempt was made to write to a full mailbox. -- -- The result value SENT is returned if the message is sent. function Current_Message_Count (Mailbox : in Mailbox_Id) return Natural; -- Purpose: CURRENT_MESSAGE_COUNT returns the number of unread messages -- in the mailbox. -- -- Where: -- -- mailbox identifies the mailbox to get message count for. -- -- Exceptions/Results: -- -- INVALID_MAILBOX is raised if the mailbox id does not identify -- an existing mailbox. procedure Delete_Mailbox (Mailbox : in Mailbox_Id; Delete_Option : in Mailbox_Delete_Option); -- Purpose: DELETE_MAILBOX deletes the given mailbox. -- -- Where: -- -- mailbox identifies the mailbox to delete. -- -- delete_option specifies the action to be taken if the mailbox -- contains messages or tasks are waiting on the -- mailbox: -- -- when delete_option_force => -- -- Ready all waiting tasks. These tasks' calls -- to READ_MAILBOX will raise the exception -- MAILBOX_DELETED or return the value DELETED. -- -- The mailbox is deleted. -- -- when delete_option_warning => -- -- If there are messages in the mailbox, then -- raise the exception MAILBOX_NOT_EMPTY in the -- calling task. -- -- If there are tasks waiting at the mailbox, then -- raise the exception MAILBOX_IN_USE in the calling -- task. -- -- The mailbox is not deleted. -- -- Exceptions: -- -- INVALID_MAILBOX is raised if the mailbox id does not identify -- an existing mailbox. -- -- MAILBOX_NOT_EMPTY is raised if an attempt was made to delete a -- non-empty mailbox and the delete option was delete_option_warning. -- -- MAILBOX_IN_USE is raised if an attempt was made to delete a -- mailbox on which tasks were waiting and the delete option was -- delete_option_warning. private type Mailbox_Rec; type Mailbox_Id is access Mailbox_Rec; end V_Mailboxes; pragma Share_Body (V_Mailboxes, False);