|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, function Hash, seg_020b53, separate Mail
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
with Queue_Generic; with Map_Generic; separate (Mail) task body Box is function Hash (Key : Transaction_Id) return Integer; package Id_Map is new Map_Generic (20, Transaction_Id, Response_Ids, Hash); package Box_Queue is new Queue_Generic (Message_Pointer); type Indicator is (Allocated, Available); type Entry_Family_Pool_Array is array (Response_Ids) of Indicator; Entry_Family_Pool : Entry_Family_Pool_Array := (others => Available); Ids : Id_Map.Map; Mailbox : Box_Queue.Queue; function Hash (Key : Transaction_Id) return Integer is begin return Key.Id; end Hash; function Get_Id return Response_Ids is begin for I in Entry_Family_Pool'Range loop if Entry_Family_Pool (I) = Available then Entry_Family_Pool (I) := Allocated; return I; end if; end loop; end Get_Id; procedure Free_Id (Id : Response_Ids) is begin Entry_Family_Pool (Id) := Available; end Free_Id; begin Id_Map.Initialize (Ids); Box_Queue.Initialize (Mailbox); loop select accept Deliver (Message : Raw_Message) do Box_Queue.Add (Q => Mailbox, X => new Raw_Message'(Message)); end Deliver; or accept Deliver_With_Reply (Message : Raw_Message; Response_Id : out Response_Ids) do declare Local_Id : Response_Ids := Get_Id; begin Box_Queue.Add (Q => Mailbox, X => new Raw_Message'(Message)); Response_Id := Local_Id; Id_Map.Define (Ids, Message.Msg_Transaction_Id, Local_Id); end; end Deliver_With_Reply; or accept Respond (Message : Raw_Message) do declare Entry_Id : constant Response_Ids := Id_Map.Eval (Ids, Message.Msg_Transaction_Id); begin accept Accept_Response (Entry_Id) (Message : out Message_Pointer) do Free_Id (Entry_Id); Id_Map.Undefine (Ids, Respond.Message.Msg_Transaction_Id); Message := new Raw_Message'(Respond.Message); end Accept_Response; end; end Respond; or when not Box_Queue.Is_Empty (Mailbox) => accept Retrieve (Message : out Message_Pointer) do Message := Box_Queue.First (Mailbox); Box_Queue.Delete (Mailbox); end Retrieve; or accept Conditional_Retrieve (Message : out Message_Pointer) do if Box_Queue.Is_Empty (Mailbox) then Message := null; else Message := Box_Queue.First (Mailbox); Box_Queue.Delete (Mailbox); end if; end Conditional_Retrieve; or terminate; end select; end loop; end Box;
nblk1=5 nid=0 hdr6=a [0x00] rec0=22 rec1=00 rec2=01 rec3=01e [0x01] rec0=02 rec1=00 rec2=05 rec3=040 [0x02] rec0=1c rec1=00 rec2=02 rec3=06a [0x03] rec0=17 rec1=00 rec2=03 rec3=006 [0x04] rec0=0c rec1=00 rec2=04 rec3=000 tail 0x2151c7e22838d44a64363 0x42a00088462061e03