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

⟦6435c6d0f⟧ Ada Source

    Length: 22528 (0x5800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body The_Orb_Package, seg_0555c7

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 Transport_Defs;
with Text_Io;
with Communication;
with The_List_Generic;
with Byte_Defs;

package body The_Orb_Package is

    type Type_Object is
        record
            The_Host : Transport_Defs.Host_Id (1 .. 4);
            The_Socket : Transport_Defs.Socket_Id (1 .. 4);
        end record;

    type Type_Contract is
        record  
            The_Host : Transport_Defs.Host_Id (1 .. 4);
            The_Socket : Transport_Defs.Socket_Id (1 .. 4);
            The_Number : Natural;
            The_Name : Variable_String;
        end record;

    type Type_Spy is
        record  
            The_Host : Transport_Defs.Host_Id (1 .. 4);
            The_Socket : Transport_Defs.Socket_Id (1 .. 4);
            The_Number : Natural;
        end record;


    package The_Pack_Of_Spy is new The_List_Generic (Type_Element => Type_Spy);
    The_List_Of_Spy : The_Pack_Of_Spy.The_List;

    package The_Pack_Of_Object is new The_List_Generic
                                         (Type_Element => Type_Object);
    The_List_Of_Object : The_Pack_Of_Object.The_List;

    The_Spy_Number : Natural := 1;       --a enlever apres le test

    -- *********************************************
    function Orb_Publication (The_Host : Transport_Defs.Host_Id;
                              The_Socket : Transport_Defs.Socket_Id;
                              The_Name : Variable_String) return Boolean is

        The_Object : Type_Object := (The_Host, The_Socket);
        The_Iter : The_Pack_Of_Object.The_Iterator;
        Is_Found : Boolean := False;
    begin
        -- Recherche de l'objet en liste
        -- =============================
        Is_Found := The_Pack_Of_Object.Search (The_List_Of_Object, The_Object);

        if Is_Found then  
            return False;   -- l'objet existe deja dans la liste
        else            -- insere L'objet

            The_List_Of_Object := The_Pack_Of_Object.Make  
                                     (The_Object, The_List_Of_Object);
            return True;
        end if;
    end Orb_Publication;


    -- *********************************************
    function Orb_Unpublication (The_Host : Transport_Defs.Host_Id;
                                The_Socket : Transport_Defs.Socket_Id;
                                The_Name : Variable_String) return Boolean is

        The_Element : Type_Object := (The_Host, The_Socket);
        Is_Ok : Boolean := False;
    begin
        The_Pack_Of_Object.Delete (The_List_Of_Object, The_Element, Is_Ok);

        return Is_Ok;
    end Orb_Unpublication;


    -- *********************************************
    function Orb_Registration
                (The_Host : Transport_Defs.Host_Id;
                 The_Socket : Transport_Defs.Socket_Id) return Boolean is

        The_Object : Type_Object := (The_Host, The_Socket);
        The_Iter : The_Pack_Of_Object.The_Iterator;
        Is_Found : Boolean := False;
    begin
        -- Recherche de l'objet en liste
        -- =============================
        Is_Found := The_Pack_Of_Object.Search (The_List_Of_Object, The_Object);

        if Is_Found then  
            return False;   -- l'objet existe deja dans la liste
        else            -- insere L'objet

            The_List_Of_Object := The_Pack_Of_Object.Make  
                                     (The_Object, The_List_Of_Object);
            return True;
        end if;
    end Orb_Registration;

    -- *********************************************
    function Orb_Unregistration
                (The_Host : Transport_Defs.Host_Id;
                 The_Socket : Transport_Defs.Socket_Id) return Boolean is

        The_Element : Type_Object := (The_Host, The_Socket);
        Is_Ok : Boolean := False;
    begin
        The_Pack_Of_Object.Delete (The_List_Of_Object, The_Element, Is_Ok);

        return Is_Ok;
    end Orb_Unregistration;

    -- *********************************************
    procedure Orb_Query is
    begin
        [statement]
    end Orb_Query;

    -- *********************************************
    procedure Orb_Request (The_Message : Message.Type_Of_Message;
                           The_Connection_Data : in out
                              Our_Constantes.Connection_Data) is

        The_New_Message : Message.Type_Of_Message;

    begin

        The_New_Message.The_Command := Our_Constantes.The_Request;

        The_New_Message.The_Host_Machine_Send :=
           The_Message.The_Host_Machine_Send;

        The_New_Message.The_Host_Machine_Receive :=
           The_Message.The_Host_Machine_To_Execute;

        The_New_Message.Data := The_Message.Data;

        The_New_Message.The_Socket_Send := The_Message.The_Socket_Send;

        The_New_Message.The_Socket_Receive := The_Message.The_Socket_To_Execute;

        Communication.Connection_Transmitter
           (The_New_Message, The_Connection_Data);
        Communication.Transmitter (The_New_Message, The_Connection_Data);
        Communication.Disconnection (The_Connection_Data);

        Text_Io.Put_Line (" envoi a la tache tierce Ok");
    end Orb_Request;

    -- *********************************************
    procedure Orb_Notification (The_Host : Transport_Defs.Host_Id;
                                The_Socket : Transport_Defs.Socket_Id;
                                The_Data : Our_String.Variable_String;
                                The_Connection_Data : in out
                                   Our_Constantes.Connection_Data) is

        The_New_Message : Message.Type_Of_Message;
        Iter : The_Pack_Of_Object.The_Iterator;
        A_Object : Type_Object;
        Boy_Host : Transport_Defs.Host_Id (1 .. 4) := The_Host;
        Boy_Socket : Transport_Defs.Socket_Id (1 .. 4) := The_Socket;

    begin

        The_New_Message.The_Command := Our_Constantes.The_Notification;

        The_New_Message.The_Host_Machine_Send := The_Host;

        The_New_Message.The_Socket_Send := The_Socket;

        The_New_Message.Data := The_Data;

        --on envoie un message a toutes les autres taches

        if not The_Pack_Of_Object.Is_Empty (The_List_Of_Object) then

            The_Pack_Of_Object.Init (Iter, The_List_Of_Object);

            loop

                A_Object := The_Pack_Of_Object.Value (Iter);
                The_New_Message.The_Socket_Receive := A_Object.The_Socket;

                The_New_Message.The_Host_Machine_Receive := A_Object.The_Host;

                -- on teste l'identite du destinataire
                -- pour qu'il ne recoive pas son propre message
                -- if not ((Byte_Defs.Byte_String (Boy_Host)=
                --          Byte_Defs.Byte_String (A_Object.The_Host)) and
                --         (Socket_Id'Image (Boy_Socket) =
                --          Socket_Id'Image (A_Object.The_Socket))) then
                Communication.Connection_Transmitter
                   (The_New_Message, The_Connection_Data);
                Communication.Transmitter
                   (The_New_Message, The_Connection_Data);
                Communication.Disconnection (The_Connection_Data);

                Text_Io.Put_Line (" Un Message d'info generale a ete envoye ");
                -- end if;

                The_Pack_Of_Object.Next (Iter);
                if The_Pack_Of_Object.Done (Iter) then
                    exit;
                end if;

            end loop;
        end if;

    end Orb_Notification;

    -- *********************************************
    procedure Orb_Forward (The_Message : Message.Type_Of_Message;
                           The_Connection_Data : in out
                              Our_Constantes.Connection_Data) is

        The_New_Message : Message.Type_Of_Message;

    begin

        The_New_Message.The_Command := Our_Constantes.The_Forward;

        The_New_Message.The_Host_Machine_Send :=
           The_Message.The_Host_Machine_Send;

        The_New_Message.The_Host_Machine_Receive :=
           The_Message.The_Host_Machine_To_Execute;

        The_New_Message.Data := The_Message.Data;

        The_New_Message.The_Socket_Send := The_Message.The_Socket_Send;

        The_New_Message.The_Socket_Receive := The_Message.The_Socket_To_Execute;

        Communication.Connection_Transmitter
           (The_New_Message, The_Connection_Data);
        Communication.Transmitter (The_New_Message, The_Connection_Data);
        Communication.Disconnection (The_Connection_Data);

        Text_Io.Put_Line (" envoi a la tache tierce Ok");

    end Orb_Forward;

    -- *********************************************
    function Orb_Subscription (The_Host : Transport_Defs.Host_Id;
                               The_Socket : Transport_Defs.Socket_Id;
                               The_Number : Natural) return Boolean is


        The_Spy : Type_Spy := (The_Host, The_Socket, The_Number);
        The_Iter : The_Pack_Of_Spy.The_Iterator;
        Is_Found : Boolean := False;

    begin

        -- Recherche de l'objet en liste
        -- =============================
        Is_Found := The_Pack_Of_Spy.Search (The_List_Of_Spy, The_Spy);

        if Is_Found then  
            return False;   -- l'espion existe deja dans la liste
        else            -- insere L'espion

            The_List_Of_Spy := The_Pack_Of_Spy.Make  
                                  (The_Spy, The_List_Of_Spy);
            return True;
        end if;

    end Orb_Subscription;

    -- *********************************************
    function Orb_Unsubscription (The_Host : Transport_Defs.Host_Id;
                                 The_Socket : Transport_Defs.Socket_Id;
                                 The_Number : Natural) return Boolean is


        The_Element : Type_Spy := (The_Host, The_Socket, The_Number);
        Is_Ok : Boolean := False;

    begin
        The_Pack_Of_Spy.Delete (The_List_Of_Spy, The_Element, Is_Ok);

        return Is_Ok;

    end Orb_Unsubscription;

    -- *********************************************
    procedure Filtration is
    begin
        [statement]
    end Filtration;


    -- *********************************************
    procedure Unfiltration is
    begin
        [statement]
    end Unfiltration;


    -- *********************************************
    procedure Send_Answer (Number_Of_The_Question : Natural;
                           The_Host : Transport_Defs.Host_Id;
                           The_Socket : Transport_Defs.Socket_Id;
                           The_Connection_Data : in out
                              Our_Constantes.Connection_Data) is

        The_Answer_Message : Message.Type_Of_Message;

    begin

        The_Answer_Message.The_Command := Our_Constantes.None;
        The_Answer_Message.The_Host_Machine_Send :=
           Our_Constantes.The_Orb.The_Host;  
        The_Answer_Message.The_Socket_Send := Our_Constantes.The_Orb.The_Socket;
        The_Answer_Message.The_Host_Machine_Receive := The_Host;
        The_Answer_Message.The_Socket_Receive := The_Socket;
        The_Answer_Message.Command_Is_Ok := True;
        The_Answer_Message.Number_Of_The_Question := Number_Of_The_Question;

        Text_Io.Put_Line ("Essai de reponse");
        Communication.Transmitter (The_Answer_Message, The_Connection_Data);
        Communication.Disconnection (The_Connection_Data);
        Text_Io.Put_Line ("Reponse Envoyee");
    end Send_Answer;


    -- *********************************************
    task Orb_Task is
        entry Ok_Message_Is_Receive (The_Message : in Message.Type_Of_Message);
    end Orb_Task;

    task body Orb_Task is
        --The_Message : Message.Type_Of_Message;
        Is_Ok : Boolean := True;
        Continue_Orb : Boolean := True;

    begin
        while Continue_Orb loop
            accept Ok_Message_Is_Receive
                      (The_Message : in Message.Type_Of_Message) do
                Text_Io.Put_Line ("T_Orb : case");

                case The_Message.The_Command is

                    when The_Registration =>
                        Text_Io.Put_Line ("essai registration");
                        Is_Ok := Orb_Registration
                                    (The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send);
                        if Is_Ok then
                            Text_Io.Put_Line ("T_Orb Registration Ok");
                        else
                            Text_Io.Put_Line ("T_Orb Registration not Ok");
                        end if;

                    when The_Unregistration =>
                        Text_Io.Put_Line ("essai unregistration");
                        Is_Ok := Orb_Unregistration
                                    (The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send);
                        if Is_Ok then
                            Text_Io.Put_Line ("T_Orb UnRegistration Ok");
                        else
                            Text_Io.Put_Line ("T_Orb UnRegistration not Ok");
                        end if;

                    when The_Query =>
                        null;

                    when The_Request =>
                        Orb_Request (The_Message,
                                     Our_Constantes.The_Orb_Connection);
                        Send_Answer (The_Message.Number_Of_The_Question,
                                     The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     Our_Constantes.The_Orb_Connection);

                    when The_Notification =>
                        Orb_Notification (The_Message.The_Host_Machine_Send,
                                          The_Message.The_Socket_Send,
                                          The_Message.Data,
                                          Our_Constantes.The_Orb_Connection);
                        Send_Answer (The_Message.Number_Of_The_Question,
                                     The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     Our_Constantes.The_Orb_Connection);

                    when The_Forward =>
                        Orb_Forward (The_Message,
                                     Our_Constantes.The_Orb_Connection);
                        Send_Answer (The_Message.Number_Of_The_Question,
                                     The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     Our_Constantes.The_Orb_Connection);

                    when The_Publication =>
                        null;

                    when The_Unpublication =>
                        null;

                    when The_Subscription =>
                        Is_Ok := Orb_Subscription
                                    (The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     The_Spy_Number);
                        if Is_Ok then
                            Text_Io.Put_Line ("T_Orb Subscription Ok");
                        else
                            Text_Io.Put_Line ("T_Orb Subscription not Ok");
                        end if;
                        Send_Answer (The_Message.Number_Of_The_Question,
                                     The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     Our_Constantes.The_Orb_Connection);

                    when The_Unsubscription =>
                        Is_Ok := Orb_Unsubscription
                                    (The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     The_Spy_Number);
                        if Is_Ok then
                            Text_Io.Put_Line ("T_Orb Unsubscription Ok");
                        else
                            Text_Io.Put_Line ("T_Orb Unsubscription not Ok");
                        end if;
                        Send_Answer (The_Message.Number_Of_The_Question,
                                     The_Message.The_Host_Machine_Send,
                                     The_Message.The_Socket_Send,
                                     Our_Constantes.The_Orb_Connection);


                    when The_Filtration =>
                        null;

                    when The_Unfiltration =>
                        null;

                    when others =>
                        Text_Io.Put_Line ("T_Orb : Message traite ok");
                end case;
            end Ok_Message_Is_Receive;
        end loop;
    end Orb_Task;


    -- *********************************************
    task Orb_Receiver_Task;

    task body Orb_Receiver_Task is
        The_Message : Message.Type_Of_Message;
        Continue_Receiver : Boolean := True;

    begin
        while Continue_Receiver loop
            Text_Io.Put_Line ("T_Receive : reception ... ");

            Communication.Connection_Receiver
               (The_Orb.The_Socket, The_Orb_Connection);
            Communication.Receiver (The_Message, The_Orb_Connection);
            Communication.Disconnection (The_Orb_Connection);

            Text_Io.Put_Line ("T_Receive : 1 Message est recu");

            Orb_Task.Ok_Message_Is_Receive (The_Message);
        end loop;
    end Orb_Receiver_Task;

    -- *********************************************

begin
    null;
end The_Orb_Package;

E3 Meta Data

    nblk1=15
    nid=2
    hdr6=26
        [0x00] rec0=23 rec1=00 rec2=01 rec3=066
        [0x01] rec0=17 rec1=00 rec2=03 rec3=066
        [0x02] rec0=1b rec1=00 rec2=13 rec3=054
        [0x03] rec0=1b rec1=00 rec2=12 rec3=01e
        [0x04] rec0=20 rec1=00 rec2=04 rec3=00a
        [0x05] rec0=15 rec1=00 rec2=07 rec3=012
        [0x06] rec0=1b rec1=00 rec2=11 rec3=05e
        [0x07] rec0=1a rec1=00 rec2=08 rec3=03c
        [0x08] rec0=1d rec1=00 rec2=15 rec3=02a
        [0x09] rec0=1c rec1=00 rec2=06 rec3=00c
        [0x0a] rec0=22 rec1=00 rec2=0f rec3=004
        [0x0b] rec0=17 rec1=00 rec2=10 rec3=00a
        [0x0c] rec0=1a rec1=00 rec2=05 rec3=006
        [0x0d] rec0=13 rec1=00 rec2=0e rec3=060
        [0x0e] rec0=11 rec1=00 rec2=14 rec3=04e
        [0x0f] rec0=15 rec1=00 rec2=0d rec3=056
        [0x10] rec0=11 rec1=00 rec2=0b rec3=07a
        [0x11] rec0=21 rec1=00 rec2=0a rec3=02c
        [0x12] rec0=0b rec1=00 rec2=0c rec3=000
        [0x13] rec0=17 rec1=00 rec2=0c rec3=000
        [0x14] rec0=17 rec1=00 rec2=0c rec3=000
    tail 0x2175f93dc87bd478fcd5d 0x42a00088462060003
Free Block Chain:
  0x2: 0000  00 09 03 fc 80 35 20 20 20 20 20 20 54 68 65 5f  ┆     5      The_┆
  0x9: 0000  00 00 03 cf 80 03 72 69 63 03 00 47 20 20 20 20  ┆      ric  G    ┆