DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦04ab63940⟧ Ada Source

    Length: 16384 (0x4000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Mail, package body Operations, package body Reply_Operations, seg_020b50

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Set_Generic;
with Unchecked_Deallocation;
with Unchecked_Conversions;
with String_Utilities;
package body Mail is

    Data_Error : exception;

    package Subscriptions is new Set_Generic (Mailbox);
    package Su renames String_Utilities;


    Number_Generator : Natural := 0;

    All_Boxes : Post_Office.Map;

    Subscription_List : Subscriptions.Set;
    procedure Free is new Unchecked_Deallocation (Box, Mailbox);
    procedure Free is new Unchecked_Deallocation (Raw_Message, Message_Pointer);

    task Semaphore is
        entry Unique_Number (N : out Natural);
    end Semaphore;

    task body Semaphore is separate;

    task body Box is separate;


    function Generate_Unique_Natural return Natural is separate;

    ----------------------------------------------------------------------

    function Register (Name : String) return Mailbox is
        New_Box : Mailbox := new Box;
    begin
        Post_Office.Define (The_Map        => All_Boxes,
                            D              => Su.Upper_Case (Su.Strip (Name)),
                            R              => New_Box,
                            Trap_Multiples => True);
        return New_Box;
    exception
        when Post_Office.Multiply_Defined =>
            Free (New_Box);
            raise Duplicate_Mailbox;
    end Register;

    procedure Add (Box : Mailbox; To : in out List) is
    begin
        To := List (Box_List.Make (Box, Box_List.List (To)));
    end Add;


    function Look_Up (Name : String) return Mailbox is
    begin
        return Post_Office.Eval (All_Boxes, Su.Upper_Case (Su.Strip (Name)));
    exception
        when Post_Office.Undefined =>
            raise Undefined_Mailbox;
    end Look_Up;

    function Get_Kind (The_Message : Raw_Message) return Kind is
    begin
        return The_Message.Msg_Kind;
    end Get_Kind;

    function Get_Transaction_Id
                (The_Message : Raw_Message) return Transaction_Id is
    begin
        return The_Message.Msg_Transaction_Id;
    end Get_Transaction_Id;

    function Is_A_Reply (The_Message : Raw_Message) return Boolean is
    begin
        return The_Message.Is_A_Reply;
    end Is_A_Reply;

    function Is_Empty (The_Message : Raw_Message) return Boolean is
    begin
        return The_Message.Is_Empty;
    end Is_Empty;

    function Response_Is_Required (The_Message : Raw_Message) return Boolean is
    begin
        return The_Message.Response_Is_Required;
    end Response_Is_Required;

    function Get_Response_Kind (The_Message : Raw_Message) return Kind is
    begin
        return The_Message.Response_Kind;
    end Get_Response_Kind;

    function Get_Priority (The_Message : Raw_Message) return Priority is
    begin
        return The_Message.Msg_Priority;
    end Get_Priority;

    function Wait (Box : Mailbox) return Raw_Message is
        Msg : Message_Pointer;
    begin
        Box.Retrieve (Msg);
        declare
            Answer : constant Raw_Message := Msg.all;
        begin
            Free (Msg);
            return Answer;
        end;
    end Wait;

    function Conditional_Read (Box : Mailbox) return Raw_Message is
        Empty_Message : constant Raw_Message :=
           Raw_Message'(Length => 0,
                        Msg_Kind => 0,
                        Response_Kind => 0,
                        Msg_Priority => 0,
                        Msg_Transaction_Id =>
                           Transaction_Id'(Id              => Integer'Last,
                                           Source_Box      => null,
                                           Destination_Box => null),
                        Is_Empty => True,
                        Is_A_Reply => False,
                        Response_Is_Required => False,
                        Msg => (others => 0));
        Msg           : Message_Pointer;
    begin
        Box.Conditional_Retrieve (Msg);
        if Msg = null then
            return Empty_Message;
        else
            declare
                Answer : constant Raw_Message := Msg.all;
            begin
                Free (Msg);
                return Answer;
            end;
        end if;
    end Conditional_Read;

    package body Operations is

        function To_Byte_String is
           new Unchecked_Conversions.Convert_To_Byte_String (Message);

        function From_Byte_String is
           new Unchecked_Conversions.Convert_From_Byte_String (Message);

        procedure Send_With_Delivery_Completion
                     (The_Message      : Message;
                      Message_Priority : Priority := Default_Priority;
                      Destination      : Mailbox) is


            Blob : constant System.Byte_String := To_Byte_String (The_Message);

            M : Raw_Message (Blob'Length) :=
               Raw_Message'(Length => Blob'Length,
                            Msg_Kind => Message_Kind,
                            Response_Kind => Kind'Last,
                            Msg_Priority => Message_Priority,
                            Msg_Transaction_Id => Null_Transaction,
                            Is_Empty => False,
                            Is_A_Reply => False,
                            Response_Is_Required => False,
                            Msg => Blob);



        begin
            Destination.Deliver (M);
        end Send_With_Delivery_Completion;

        package body Reply_Operations is

            function To_Byte_String is
               new Unchecked_Conversions.Convert_To_Byte_String (Reply);

            function From_Byte_String is
               new Unchecked_Conversions.Convert_From_Byte_String (Reply);

            function Send_Blocked_With_Application_Reply
                        (The_Message      : Message;
                         Message_Priority : Priority := Default_Priority;
                         Destination      : Mailbox) return Reply is


                Response_Id   : Response_Ids;
                Reply_Pointer : Message_Pointer;
                Blob          : constant System.Byte_String :=
                   To_Byte_String (The_Message);

                M : Raw_Message (Blob'Length) :=
                   Raw_Message'(Length => Blob'Length,
                                Msg_Kind => Message_Kind,
                                Response_Kind => Reply_Kind,
                                Msg_Priority => Message_Priority,
                                Msg_Transaction_Id =>
                                   (Generate_Unique_Natural, null, Destination),
                                Is_A_Reply => False,
                                Is_Empty => False,
                                Response_Is_Required => True,
                                Msg => Blob);
            begin
                Destination.Deliver_With_Reply (M, Response_Id);
                Destination.Accept_Response (Response_Id) (Reply_Pointer);
                declare
                    Answer : constant Reply :=
                       From_Byte_String (Reply_Pointer.Msg);
                begin
                    Free (Reply_Pointer);
                    return Answer;
                end;
            end Send_Blocked_With_Application_Reply;


            function Send_Nonblocked_With_Application_Reply
                        (The_Message      : Message;
                         Message_Priority : Priority := Default_Priority;
                         Source           : Mailbox;
                         Destination      : Mailbox) return Transaction_Id is

                Blob : constant System.Byte_String :=
                   To_Byte_String (The_Message);

                M : Raw_Message (Blob'Length) :=
                   Raw_Message'(Length => Blob'Length,
                                Msg_Kind => Message_Kind,
                                Response_Kind => Reply_Kind,
                                Msg_Priority => Message_Priority,
                                Msg_Transaction_Id => (Generate_Unique_Natural,
                                                       Source, Destination),
                                Is_A_Reply => False,
                                Is_Empty => False,
                                Response_Is_Required => True,
                                Msg => Blob);


            begin
                Destination.Deliver (M);
                return M.Msg_Transaction_Id;
            end Send_Nonblocked_With_Application_Reply;

            function Receive (The_Message : Raw_Message) return Reply is
            begin
                if The_Message.Msg_Kind /= Reply_Kind then
                    raise Data_Error;
                else
                    return From_Byte_String (The_Message.Msg);
                end if;
            end Receive;

            procedure Nonblocked_Reply (The_Reply   : Reply;
                                        Transaction : Transaction_Id) is

                Blob : constant System.Byte_String :=
                   To_Byte_String (The_Reply);

                M : Raw_Message (Blob'Length) :=
                   Raw_Message'(Length => Blob'Length,
                                Msg_Kind => Reply_Kind,
                                Response_Kind => Kind'Last,
                                Msg_Priority => Default_Priority,
                                Msg_Transaction_Id => Transaction,
                                Is_A_Reply => True,
                                Is_Empty => False,
                                Response_Is_Required => False,
                                Msg => Blob);

            begin
                -- two cases: blocked or nonblocked sender
                if Transaction.Source_Box = null then
                    -- blocked case
                    -- reply to my task queue, so that it may in turn
                    -- reply to the sender who is waiting
                    Transaction.Destination_Box.Respond (M);
                else
                    -- unblocked case
                    -- return the reply to the sender's mailbox
                    Transaction.Source_Box.Deliver (M);
                end if;

            end Nonblocked_Reply;

        end Reply_Operations;

        procedure Multicast (The_Message      : Message;
                             Message_Priority : Priority := Default_Priority;
                             Destinations     : List) is

            Iter : Box_List.Iterator;


        begin
            Box_List.Init (Iter, Box_List.List (Destinations));
            while not Box_List.Done (Iter) loop
                Send_With_Delivery_Completion
                   (The_Message      => The_Message,
                    Message_Priority => Message_Priority,
                    Destination      => Box_List.Value (Iter));
                Box_List.Next (Iter);
            end loop;
        end Multicast;
        procedure Broadcast (The_Message      : Message;
                             Message_Priority : Priority := Default_Priority) is
            Iter : Subscriptions.Iterator;
        begin
            Subscriptions.Init (Iter => Iter, S => Subscription_List);
            while not Subscriptions.Done (Iter) loop
                Send_With_Delivery_Completion
                   (The_Message      => The_Message,
                    Message_Priority => Message_Priority,
                    Destination      => Subscriptions.Value (Iter));
                Subscriptions.Next (Iter);
            end loop;
        end Broadcast;

        procedure Subscribe (Box : Mailbox) is
        begin
            Subscriptions.Add (S => Subscription_List, X => Box);
        end Subscribe;

        procedure Cancel_Subscription (Box : Mailbox) is
        begin
            Subscriptions.Delete (S => Subscription_List, X => Box);
        end Cancel_Subscription;

        function Receive (The_Message : Raw_Message) return Message is
        begin
            if The_Message.Msg_Kind /= Message_Kind then
                raise Data_Error;
            else
                return From_Byte_String (The_Message.Msg);
            end if;
        end Receive;
    end Operations;
begin
    Post_Office.Initialize (All_Boxes);
    Subscriptions.Initialize (Subscription_List);
end Mail;

E3 Meta Data

    nblk1=f
    nid=0
    hdr6=1e
        [0x00] rec0=26 rec1=00 rec2=01 rec3=034
        [0x01] rec0=1f rec1=00 rec2=02 rec3=01e
        [0x02] rec0=1f rec1=00 rec2=03 rec3=01c
        [0x03] rec0=19 rec1=00 rec2=04 rec3=02c
        [0x04] rec0=00 rec1=00 rec2=0f rec3=014
        [0x05] rec0=20 rec1=00 rec2=05 rec3=00a
        [0x06] rec0=1a rec1=00 rec2=06 rec3=004
        [0x07] rec0=13 rec1=00 rec2=07 rec3=04c
        [0x08] rec0=01 rec1=00 rec2=0e rec3=000
        [0x09] rec0=18 rec1=00 rec2=08 rec3=044
        [0x0a] rec0=16 rec1=00 rec2=09 rec3=034
        [0x0b] rec0=17 rec1=00 rec2=0a rec3=008
        [0x0c] rec0=1a rec1=00 rec2=0b rec3=01e
        [0x0d] rec0=16 rec1=00 rec2=0c rec3=046
        [0x0e] rec0=15 rec1=00 rec2=0d rec3=000
    tail 0x2171d2c9e838d44a1dd58 0x42a00088462061e03