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

⟦693bb8834⟧ Ada Source

    Length: 11264 (0x2c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, procedure Phl, seg_058165

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




-- UNIT: procedure PHL
-- FILES: phl.a
-- COMPILE: ada phl.a -M phl -o phl
-- PURPOSE: tasking test and demonstration
-- DESCRIPTION: The dining philosophers problem.
--                 Usage: phl
-- .......................................................................... --
with Text_Io;
procedure Phl is

    Print_Task_Starts : constant Boolean := True;

    Term_Type : Character := '1';

    subtype Seat is Integer range 0 .. 4;

    task type Output is
        entry Put_Cursor (S : Seat; At_Table, Eating : Boolean);
        entry Put_Line (S : in String);
        entry Put (S : in String);
        entry Term_Type_Entry (X : in Character);
        entry Clear_Screen;
    end Output;

    O : Output;

    task type Dining_Room is
        entry Allocate_Seat (S : out Seat);
        entry Enter;
        entry Leave;
    end Dining_Room;

    Dr : Dining_Room;

    task type Fork is
        entry Pick_Up;
        entry Put_Down;
    end Fork;

    Cutlery : array (0 .. 4) of Fork;

    task type Philosopher;

    School : array (0 .. 4) of Philosopher;

    task Rand_Delay is
        entry Rand;
    end Rand_Delay;

    task body Output is

        Term_Type : Character; -- '1' for vt100, '2' for f100
        Clear_Sc : constant String := Ascii.Esc & '*';
        use Text_Io;
        Pnum : Character;
        R_S : Seat;
        R_At_Table, R_Eating : Boolean;

        type Xy_Position is
            record
                X : Integer range 0 .. 79;
                Y : Integer range 0 .. 23;
            end record;

        Eating_Coords : array (Seat) of Xy_Position :=
           ((28, 6), (25, 12), (36, 15), (46, 12), (44, 6));

        Thinking_Coords : array (Seat) of Xy_Position :=
           ((20, 21), (30, 21), (40, 21), (50, 21), (60, 21));

        procedure Put (Item : in String; Pos : in Xy_Position) is

            Xp : Integer := Pos.X;
            Yp : Integer := Pos.Y;
            Elp : Integer;
            type As is access String;
            S : As := new String'(Item);
            Xs : As := new String'(Integer'Image (Xp));
            Ys : As := new String'(Integer'Image (Yp));

        begin
            if Yp /= 23 then
                Elp := 79;
            else
                Elp := 78;
            end if; -- can't write 79,23

            if (Xp + S'Length > Elp) then
                S := new String'(S (S'First .. S'First + Elp - Xp));
            end if;

            -- position and write string
            if Term_Type = '1' then
                Text_Io.Put (Ascii.Esc & "[" & Ys (2 .. Ys'Last) &
                             ";" & Xs (2 .. Xs'Last) & "H" & S.all);
            else
                Text_Io.Put (Ascii.Esc & "=" & Character'Val (32 + Yp) &
                             Character'Val (32 + Xp) & S.all);
            end if;
        end Put;

    begin
        accept Term_Type_Entry (X : in Character) do
            Term_Type := X;
        end Term_Type_Entry;

        loop
            select
                accept Put_Cursor (S : Seat; At_Table, Eating : Boolean) do
                    R_S := S;
                    R_At_Table := At_Table;
                    R_Eating := Eating;

                    Pnum := Character'Val (R_S + 1 + Character'Pos ('0'));
                    if R_At_Table then
                        Put ("  ", Thinking_Coords (R_S));
                        if R_Eating then
                            Put ("P" & Pnum & "E", Eating_Coords (R_S));
                        else
                            Put ("P" & Pnum & " ", Eating_Coords (R_S));
                        end if;
                    else
                        Put ("   ", Eating_Coords (R_S));
                        Put ("P" & Pnum, Thinking_Coords (R_S));
                    end if;
                end Put_Cursor;
            or
                accept Put (S : in String) do
                    Text_Io.Put (S);
                end Put;
            or
                accept Put_Line (S : in String) do
                    Text_Io.Put_Line (S);
                end Put_Line;
            or
                accept Clear_Screen do
                    if Term_Type = '1' then
                        Text_Io.Put (Ascii.Esc & "[2J" & Ascii.Esc & "[H");
                    else
                        Text_Io.Put (Clear_Sc);
                    end if;
                    delay 0.1;
                end Clear_Screen;

            end select;
        end loop;
    end Output;

    task body Dining_Room is

        Seats_Filled : Integer range 0 .. 5 := 0;
        Seat_Allocation : Seat := 0;

    begin
        if Print_Task_Starts then
            O.Put_Line ("dining room starting");
        end if;

        O.Clear_Screen;
        O.Put_Line ("                    non_stop eating and thinking!");

        O.Put_Line ("   ");
        O.Put_Line ("   ");
        O.Put_Line ("   ");
        O.Put_Line ("                                   ***");
        O.Put_Line ("                                 *******");
        O.Put_Line ("                               ***********");
        O.Put_Line ("                             **O***   ******");
        O.Put_Line ("                           ******  @@@  ***O**");
        O.Put_Line ("                           *****  @@@@@  *****");
        O.Put_Line ("                            *****  @@@  *****");
        O.Put_Line ("                             **O**     **O**");
        O.Put_Line ("                              ******O******");
        O.Put_Line ("                               ***********");
        O.Put_Line ("   ");
        O.Put_Line ("   ");

        loop
            select
                --allocate fixed seat numbers to each of the five philosophers
                accept Allocate_Seat (S : out Seat) do
                    S := Seat_Allocation;
                    if Seat_Allocation < 4 then
                        Seat_Allocation := Seat_Allocation + 1;
                    end if;
                end Allocate_Seat;
            or
                when Seats_Filled < 5 =>
                    accept Enter do
                        Seats_Filled := Seats_Filled + 1;
                    end Enter;
            or
                accept Leave do
                    Seats_Filled := Seats_Filled - 1;
                end Leave;
            end select;
        end loop;
    end Dining_Room;

    task body Fork is
    begin
        if Print_Task_Starts then
            O.Put_Line ("fork starting");
        end if;

        loop
            accept Pick_Up;
            accept Put_Down;
        end loop;
    end Fork;

    task body Rand_Delay is
        Random : Duration := 0.4;
    begin
        loop
            Random := Random + 0.05;
            if Random > 0.7 then
                Random := 0.4;
            end if;
            accept Rand do
                delay Random;
            end Rand;
        end loop;
    end Rand_Delay;

    task body Philosopher is
        S : Seat;
    begin
        if Print_Task_Starts then
            O.Put_Line ("philosopher starting");
        end if;

        Dr.Allocate_Seat (S); --obtain seat on joining institution;
        Dr.Enter;
        O.Put_Cursor (S, At_Table => True, Eating => False);
        Rand_Delay.Rand;

        loop
            Cutlery (S).Pick_Up;
            select
                Cutlery ((S + 1) mod 5).Pick_Up; --obtained two forks;
                -- philosopher begins to eat
                O.Put_Cursor (S, At_Table => True, Eating => True);
                delay 1.0;

                Cutlery ((S + 1) mod 5).Put_Down;
                Cutlery (S).Put_Down;

                --leave the room to think
                Dr.Leave;
                O.Put_Cursor (S, At_Table => False, Eating => False);
                delay 1.2;

                -- enter dining room again
                Dr.Enter;
                O.Put_Cursor (S, At_Table => True, Eating => False);
                delay 0.9;
            or
                -- let someone else try for 2 forks
                delay 0.9;
                Cutlery (S).Put_Down;
                Rand_Delay.Rand;
            end select;

        end loop;
    end Philosopher;

begin
    Text_Io.Put ("is this a vt100 (1) or an f100 (2) -->");
    Text_Io.Get (Term_Type);
    if Term_Type /= '1' and Term_Type /= '2' then
        Text_Io.Put ("that's not a 1 or a 2, i'll assume you have a vt100");
    end if;
    O.Term_Type_Entry (Term_Type);
end Phl;
pragma Main;
-- .......................................................................... --
--
-- DISTRIBUTION AND COPYRIGHT:
--
-- This software is released to the Public Domain (note:
--   software released to the Public Domain is not subject
--   to copyright protection).
-- Restrictions on use or distribution:  NONE
--
-- DISCLAIMER:
--
-- This software and its documentation are provided "AS IS" and
-- without any expressed or implied warranties whatsoever.
-- No warranties as to performance, merchantability, or fitness
-- for a particular purpose exist.
--
-- Because of the diversity of conditions and hardware under
-- which this software may be used, no warranty of fitness for
-- a particular purpose is offered.  The user is advised to
-- test the software thoroughly before relying on it.  The user
-- must assume the entire risk and liability of using this
-- software.
--
-- In no event shall any person or organization of people be
-- held responsible for any direct, indirect, consequential


E3 Meta Data

    nblk1=a
    nid=0
    hdr6=14
        [0x00] rec0=27 rec1=00 rec2=01 rec3=026
        [0x01] rec0=24 rec1=00 rec2=0a rec3=044
        [0x02] rec0=1e rec1=00 rec2=09 rec3=006
        [0x03] rec0=18 rec1=00 rec2=08 rec3=012
        [0x04] rec0=21 rec1=00 rec2=07 rec3=05e
        [0x05] rec0=15 rec1=00 rec2=06 rec3=01e
        [0x06] rec0=23 rec1=00 rec2=05 rec3=008
        [0x07] rec0=21 rec1=00 rec2=04 rec3=028
        [0x08] rec0=20 rec1=00 rec2=03 rec3=006
        [0x09] rec0=16 rec1=00 rec2=02 rec3=000
    tail 0x21765743c87e0557e5c39 0x42a00088462060003