|
|
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 - metrics - downloadIndex: B T
Length: 6873 (0x1ad9)
Types: TextFile
Names: »B«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
└─⟦77aa8350c⟧ »DATA«
└─⟦f794ecd1d⟧
└─⟦24d1ddd49⟧
└─⟦this⟧
-- The use of this system is subject to the software license terms and
-- conditions agreed upon between Rational and the Customer.
--
-- Copyright 1988 by Rational.
--
-- RESTRICTED RIGHTS LEGEND
--
-- Use, duplication, or disclosure by the Government is subject to
-- restrictions as set forth in subdivision (b)(3)(ii) of the Rights in
-- Technical Data and Computer Software clause at 52.227-7013.
--
--
-- Rational
-- 3320 Scott Boulevard
-- Santa Clara, California 95054-3197
--
-- PROPRIETARY AND CONFIDENTIAL INFORMATION OF RATIONAL;
-- USE OR COPYING WITHOUT EXPRESS WRITTEN AUTHORIZATION
-- IS STRICTLY PROHIBITED. THIS MATERIAL IS PROTECTED AS
-- AN UNPUBLISHED WORK UNDER THE U.S. COPYRIGHT ACT OF
-- 1976. CREATED 1988. ALL RIGHTS RESERVED.
--
--
separate (Task_Management)
package body Ipc_Support is
pragma Suppress_All;
procedure Purge_A_Queue
(For_Task : Task_Id; The_Queue : Mq.Id; Was_Ipc_Q : Boolean) is
pragma Routine_Number (Runtime_Ids.Internal);
Status : Mq.Stratus;
Message : Entry_Call_Message;
Next_Caller : Task_Id;
begin
if Was_Ipc_Q then
Ipc.Evacuate_Queue (The_Queue => The_Queue,
Queue_Data => Message_Queue_Utilities.
Get_Associated_Data
(The_Queue, For_Task));
end if;
Mq.Delete_If_Empty (The_Queue, Status);
if Status = Mq.Q_Notemp then
loop
Mq.Retrieve_If_Available (The_Queue, Message'Address,
Entry_Call_Message_Size, Status);
exit when Status = Mq.Q_Nomess;
Message_Queue_Utilities.Cancel_Timer
(Message.Timer_Id, Current_Task => For_Task);
Next_Caller := To_Task_Id (Message.Caller);
Next_Caller.Exception_Id := Exceptions.Tasking_Error;
Next_Caller.Action_State (Exception_Pending) := True;
Message_Queue_Utilities.Send_Reply
(Next_Caller, Rendezvous_Done, Current_Task => For_Task);
end loop;
Mq.Delete_If_Empty (The_Queue, Status);
end if;
if Safety_Check then
Checking.Check_Message_Queue_Status
(Status, Err.Bad_Status_From_Delete_If_Empty,
Current_Task => For_Task);
end if;
end Purge_A_Queue;
procedure Attach_Queue (For_Entry : Entry_Id;
New_Queue : Message_Queues.Id;
Result : out Status) is
pragma Routine_Number (Runtime_Ids.Internal);
Current_Task : constant Task_Id := Get_Current_Task_And_Acquire_Lock;
Length : Mq.Queue_Length;
Status : Mq.Stratus;
begin
if Debug_Mode then
Debugging.Put_Message ("Entered Attach_Queue");
end if;
-- test if Queue is valid, Length is non-destructive
Mq.Length (New_Queue, Status, Length);
if Status /= Mq.Q_Success then
Result := Invalid_Queue;
elsif For_Entry not in Valid_Entry_Id'First ..
Entry_Id (Current_Task.Queues.
Wait_List.List'Last) then
Result := Invalid_Entry;
else
declare
The_Item : Mq.Wait_Item
renames Current_Task.Queues.Wait_List.List
(Mq.Wait_List_Index (For_Entry));
Prior_Q : constant Mq.Id := The_Item.Wait_Queue;
Was_Ipc : constant Boolean := The_Item.Ipc_Queue;
begin
The_Item.Wait_Queue := New_Queue;
The_Item.Ipc_Queue := False;
The_Item.Ipc_Queue := True;
Purge_A_Queue (For_Task => Current_Task,
The_Queue => Prior_Q,
Was_Ipc_Q => Was_Ipc);
end;
Result := Success;
end if;
Release_Lock;
end Attach_Queue;
procedure Detach_Queue (For_Entry : Entry_Id; Result : out Status) is
pragma Routine_Number (Runtime_Ids.Internal);
Current_Task : constant Task_Id := Get_Current_Task_And_Acquire_Lock;
begin
if Debug_Mode then
Debugging.Put_Message ("Entered Detach_Queue");
end if;
if For_Entry not in Valid_Entry_Id'First ..
Entry_Id (Current_Task.Queues.
Wait_List.List'Last) then
Result := Invalid_Entry;
else
declare
The_Item : Mq.Wait_Item
renames Current_Task.Queues.Wait_List.List
(Mq.Wait_List_Index (For_Entry));
Prior_Q : constant Mq.Id := The_Item.Wait_Queue;
Was_Ipc : constant Boolean := The_Item.Ipc_Queue;
New_Queue : Mq.Id;
Status : Mq.Stratus;
begin
if Was_Ipc then
Mq.Create (Max_Message_Size => Entry_Call_Message_Size,
Max_Message_Count => 64, -- ??
Result => Status,
New_Queue => New_Queue);
if Status = Mq.Q_Quesiz then
if Debug_Mode then
Debugging.Put_Message
("Message_Queue.Create failed due to lack of storage; raising Storage_Error");
end if;
Runtime_Exceptions.Raise_Storage_Error;
else
if Safety_Check then
Checking.Check_Message_Queue_Status
(Status, Err.Bad_Status_From_Create,
Current_Task => Current_Task);
end if;
end if;
The_Item.Wait_Queue := New_Queue;
The_Item.Ipc_Queue := False;
Purge_A_Queue (For_Task => Current_Task,
The_Queue => Prior_Q,
Was_Ipc_Q => True);
Result := Success;
else
Result := Invalid_Queue;
end if;
end;
end if;
Release_Lock;
end Detach_Queue;
end Ipc_Support;
pragma Runtime_Unit (Unit_Number => Runtime_Ids.Runtime_Compunit,
Elab_Routine_Number => Runtime_Ids.Internal);