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

⟦dad6931ad⟧ Ada Source

    Length: 9216 (0x2400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Echo, seg_002fe3

Derivation

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

E3 Source Code



with Byte_Defs;
with Calendar;
with Log;
with Profile;
with Time_Utilities;
with Transport;
with Transport_Name;
with Utilities;
--
package body Echo is

    use Utilities;

    procedure Server (Network : Transport_Defs.Network_Name := "UDP/IP";
                      Socket : Transport_Defs.Socket_Id := Echo.Socket) is
        C : Transport.Connection_Id;
        Status : Transport_Defs.Status_Code;
        Count : Natural;
        Data : Byte_Defs.Byte_String (1 .. 1024);
    begin  
        Log.Put_Line ("echo.server");
        loop -- forever
            begin
                Transport.Open (C, Status, Network, Socket);
                Check (Status, "Transport.Open");
                Transport.Connect (C, Status);
                Check (Status, "Transport.Connect");
                loop
                    Transport.Receive (C, Status, Data, Count);
                    Check (Status, "Transport.Receive");
                    Transport.Transmit (C, Status, Data (1 .. Count), Count);
                    Check (Status, "Transport.Transmit");
                end loop;
            exception
                when others =>
                    null;
            end;
            Transport.Close (C);
            exit when Transport_Defs."=" (Status, Transport_Defs.Socket_In_Use);
        end loop;
    end Server;

    procedure Client (Server : Transport_Defs.Host_Id;
                      Data : Byte_Defs.Byte_String;
                      Repeat : Positive := 1;
                      Interval : Duration := 0.0;
                      Max_Wait : Duration := Echo.Max_Wait;
                      Network : Transport_Defs.Network_Name := "UDP/IP";
                      Socket : Transport_Defs.Socket_Id := Echo.Socket) is
        C : Transport.Connection_Id;
        Status : Transport_Defs.Status_Code;
        Sent : constant Byte_Defs.Byte_String (1 .. Data'Length) := Data;
        Count, Total : Natural;
        Started : Calendar.Time;
        task Receiver is
            entry Start;
            entry Finish;
        end Receiver;
        task body Receiver is
            Count : Natural;
            Total : Natural := 0;
            Rcvd : Byte_Defs.Byte_String (Sent'Range);
            Elapsed : Duration;
            Packets : Natural := 0;
            Min : Duration := Duration'Last;
            Max : Duration := 0.0;
            Ttl : Duration := 0.0;
        begin
            loop
                select
                    accept Start;
                or
                    accept Finish;
                    exit;
                end select;
                begin
                    Transport.Receive (C, Status, Rcvd, Total, Max_Wait);
                    while Total < Rcvd'Length loop
                        Check (Status, "Transport.Receive");
                        Transport.Receive
                           (C, Status, Rcvd (1 + Total .. Rcvd'Last),
                            Count, Max_Wait);
                        Total := Total + Count;
                    end loop;
                    Elapsed := Calendar."-" (Calendar.Clock, Started);
                    if Byte_Defs."=" (Rcvd, Sent) then
                        Packets := Packets + 1;
                        Ttl := Ttl + Elapsed;
                        if Min > Elapsed then
                            Min := Elapsed;
                        end if;
                        if Max < Elapsed then
                            Max := Elapsed;
                        end if;
                    else
                        Log.Put_Line ("Data were not echoed correctly.",
                                      Profile.Error_Msg);
                    end if;
                exception
                    when others =>
                        null;
                end;
            end loop;
            if Packets = 1 then
                Log.Put_Line ("echoed" & Natural'Image (Sent'Length) &
                              " bytes in " & Time_Utilities.Image (Ttl),
                              Profile.Auxiliary_Msg);
            elsif Packets > 1 then
                Log.Put_Line ("echoed" & Natural'Image (Packets) &
                              Natural'Image (Sent'Length) & "-byte packets in:",
                              Profile.Auxiliary_Msg);
                Log.Put_Line ("average " & Time_Utilities.Image (Ttl / Packets),
                              Profile.Auxiliary_Msg);
                Log.Put_Line ("minimum " & Time_Utilities.Image (Min),
                              Profile.Auxiliary_Msg);
                Log.Put_Line ("maximum " & Time_Utilities.Image (Max),
                              Profile.Auxiliary_Msg);
            end if;
            Transport.Close (C);
        end Receiver;
        procedure Transmit is
        begin
            Receiver.Start;
            Started := Calendar.Clock;
            Transport.Transmit (C, Status, Sent, Total);
            while Total < Sent'Length loop
                Check (Status, "Transport.Transmit");
                Transport.Transmit (C, Status,
                                    Sent (1 + Total .. Sent'Last), Count);
                Total := Total + Count;
            end loop;
        end Transmit;
    begin
        Log.Put_Line ("echo.client");
        Transport.Open (C, Status, Network);
        Check (Status, "Transport.Open");
        Transport.Connect (C, Status, Server, Socket);
        Check (Status, "Transport.Connect");
        Transmit;
        for I in 2 .. Repeat loop
            delay Interval;
            Transmit;
        end loop;
        Receiver.Finish;
    exception
        when others =>
            abort Receiver;
            Transport.Close (C);
            raise;
    end Client;

    procedure Client (Server : String := ">>machine name<<";
                      Data : Byte_Defs.Byte_String;
                      Repeat : Positive := 1;
                      Interval : Duration := 0.0;
                      Max_Wait : Duration := Echo.Max_Wait;
                      Network : Transport_Defs.Network_Name := "UDP/IP";
                      Socket : Transport_Defs.Socket_Id := Echo.Socket) is
    begin
        Client (Transport_Name.Host_To_Host_Id (Server), Data,
                Repeat, Interval, Max_Wait, Network, Socket);
    exception
        when Transport_Name.Undefined =>
            Log.Put_Line
               ('"' & Server &
                """ is not a machine name (Transport_Name.Undefined).",
                Profile.Exception_Msg);
            raise;
    end Client;

    procedure Client (Server : Transport_Defs.Host_Id;
                      Data : String := "hello!";
                      Repeat : Positive := 1;
                      Interval : Duration := 0.0;
                      Max_Wait : Duration := Echo.Max_Wait;
                      Network : Transport_Defs.Network_Name := "UDP/IP";
                      Socket : Transport_Defs.Socket_Id := Echo.Socket) is
    begin
        Client (Server, Convert (Data), Repeat,
                Interval, Max_Wait, Network, Socket);
    end Client;

    procedure Client (Server : String := ">>machine name<<";
                      Data : String := "hello!";
                      Repeat : Positive := 1;
                      Interval : Duration := 0.0;
                      Max_Wait : Duration := Echo.Max_Wait;
                      Network : Transport_Defs.Network_Name := "UDP/IP";
                      Socket : Transport_Defs.Socket_Id := Echo.Socket) is
    begin
        Client (Server, Convert (Data), Repeat,
                Interval, Max_Wait, Network, Socket);
    end Client;

end Echo;

E3 Meta Data

    nblk1=8
    nid=0
    hdr6=10
        [0x00] rec0=20 rec1=00 rec2=01 rec3=03c
        [0x01] rec0=16 rec1=00 rec2=02 rec3=03a
        [0x02] rec0=1c rec1=00 rec2=03 rec3=064
        [0x03] rec0=18 rec1=00 rec2=04 rec3=016
        [0x04] rec0=13 rec1=00 rec2=05 rec3=02e
        [0x05] rec0=1d rec1=00 rec2=06 rec3=010
        [0x06] rec0=16 rec1=00 rec2=07 rec3=03e
        [0x07] rec0=15 rec1=00 rec2=08 rec3=000
    tail 0x20f0013e4000806bb9332 0x42a00088462060003