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

⟦b8f876d0c⟧ Ada Source

    Length: 22528 (0x5800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, seg_03bdbc

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




-- Copyright 1986,1987,1988 Verdix Corporation

------------------------------------------------------------------------------
-- User interface to the ADA tasking operations
--
-- The compiler calls the following subprograms to implement the
-- ADA tasking semantics.
------------------------------------------------------------------------------
WITH System;
USE System;
WITH V_I_Types;
PACKAGE V_I_Taskop IS

   PRAGMA Suppress (All_Checks);
   PRAGMA Suppress (Exception_Tables);
   PRAGMA Not_Elaborated;

   SUBTYPE A_Task_T    IS V_I_Types.A_Task_T;
   SUBTYPE A_Program_T IS V_I_Types.A_Program_T;
   SUBTYPE Day_T       IS V_I_Types.Day_T;

   --------------------------------------------------------------------------
   -- Tasking operation data structures
   --------------------------------------------------------------------------

   TYPE A_Master_T   IS PRIVATE;
   TYPE A_Alist_T    IS PRIVATE;
   TYPE Act_Status_T IS (Act_Ok, Act_Elab_Err, Act_Except,
                         Act_Elab_Err_Act_Except);

   -- Select statements are implemented with a list of open entry numbers
   -- (zero for closed entries); the number of items in this list is passed
   -- as a parameter.
   TYPE Entry_Record_T IS
      RECORD
         Entry_Id : Integer;
      END RECORD;
   TYPE A_Entry_Record_T IS ACCESS Entry_Record_T;
   -- Delay records follow entry record in the list that compiler-generated
   -- code passes to ts_select_delay.
   TYPE Delay_Record_T IS
      RECORD
         Delay_Alt_Return_Info : Integer;
         Seconds_To_Delay      : Duration;
      END RECORD;
   TYPE A_Delay_Record_T IS ACCESS Delay_Record_T;

   TYPE Abort_List_T IS
      RECORD
         Tsk : A_Task_T;
      END RECORD;
   TYPE A_Abort_List_T IS ACCESS Abort_List_T;

   --------------------------------------------------------------------------
   -- Task abort
   --------------------------------------------------------------------------
   PROCEDURE Ts_Abort (User_Abort_List   : IN A_Abort_List_T;
                       Abort_List_Length : IN Integer);

   --------------------------------------------------------------------------
   -- Task activation
   --------------------------------------------------------------------------

   FUNCTION Ts_Init_Activate_List RETURN A_Alist_T;

   -- This activates a group of tasks at once.
   PROCEDURE Ts_Activate_List
                (Activation_List : A_Alist_T; Is_Allocator : Integer);

   -- This enters the named task into the runnable pool of tasks.
   -- The return_pc parameter is used for debugging purposes.
   PROCEDURE Ts_Activate (Tsk : IN A_Task_T; Return_Pc : IN Address);

   -- This is called by a newly-activated task to indicate to the RTS
   -- that is had completed its activation.  This will cause the
   -- activating task to unblock.
   PROCEDURE Ts_Activation_Complete (Act_Status : IN Act_Status_T);

   FUNCTION Ts_Activation_Exceptions RETURN Act_Status_T;

   --------------------------------------------------------------------------
   -- Task attributes
   --------------------------------------------------------------------------

   -- This is called when the CALLABLE attribute is used.
   FUNCTION Ts_Callable (Tsk : IN A_Task_T) RETURN Boolean;

   -- This implements the 'TERMINATED attribute.
   FUNCTION Ts_Terminated (Tsk : IN A_Task_T) RETURN Boolean;

   -- This returns the number of tasks queued at the entry (of the
   -- current task) whose id is passed.  This implements the 'COUNT
   -- attribute.
   FUNCTION Ts_Entry_Count (Entry_Id : IN Integer) RETURN Integer;

   --------------------------------------------------------------------------
   -- Task rendezvous
   --------------------------------------------------------------------------

   -- This is called by generated code to due an plain entry call.
   -- The task to call is named by the task id passed in 'called_task'.
   -- The entry id to do the call on is passed in 'called_entry'.
   -- A pointer to the parameters to pass to the accept statement
   -- that accepts this call is passed in 'param_block'.
   PROCEDURE Ts_Call (Called_Task  : IN A_Task_T;
                      Called_Entry : IN Integer;
                      Param_Block  : IN Address);

   -- This is called by the generated code to do a conditional entry
   -- call.
   -- This is like 'ts_call' except that is will return immediately
   -- with a return value of false if the call cannot be accepted right
   -- away.
   FUNCTION Ts_Conditional_Call (Called_Task  : IN A_Task_T;
                                 Called_Entry : IN Integer;
                                 Param_Block  : IN Address) RETURN Boolean;

   -- This is like 'ts_conditional_call' above except that it will
   -- wait for a specified amount of time for the call to go through
   -- if it is not immediately able to perform the call.  The time
   -- to wait for the call it passed in 'timeout' and is in milliseconds.
   FUNCTION Ts_Timed_Call (Timeout      : IN Duration;
                           Called_Task  : IN A_Task_T;
                           Called_Entry : IN Integer;
                           Param_Block  : IN Address) RETURN Boolean;

   -- An entry list is built by the generated code during the
   -- evaluation of the guards of a select statment.  A pointer to
   -- the entry list and it length (in entries) is passed to one of
   -- the 'ts_select ...' routines.
   --
   -- An entry list is a list of small integers that are either zero
   -- or the index of an entry.  Each integer corresponds to an accept
   -- alternative in the select statement being executed.  A zero
   -- indicates that the alternative is closed.  A non-zero value
   -- indicates that the alternative is open an its value indicates the
   -- entry being accepted.
   --
   -- If an entry is accepted in a select procedure, its index in the
   -- entry list is returned in the 'result' parameter.
   --
   -- This is called when a select statement having no else, terminate,
   -- or delay alternatives is executed.
   PROCEDURE Ts_Select (User_Entry_List : IN  A_Entry_Record_T;
                        Elist_Len       : IN  Integer;
                        Param_Block     : OUT Address;
                        Result          : OUT Integer);

   -- This is called when an accept statement that is not an alternative
   -- of a select statement is executed.
   FUNCTION Ts_Accept (Accepting_Entry : IN Integer) RETURN Address;

   -- This is called when an accept statement doesn't have any parameters or a
   -- "do ... end" sequence of statements. The accept simply serves as a
   -- synchronization point. There isn't a subsequent ts_finish_accept.
   PROCEDURE Ts_Fast_Accept (Accepting_Entry : Integer);

   -- This is called when a select statment with an else alternative
   -- is executed.  If the else alternative is taken the 'result'
   -- parameter is returned with -1.
   PROCEDURE Ts_Select_Else (User_Entry_List : IN  A_Entry_Record_T;
                             Elist_Len       : IN  Integer;
                             Param_Block     : OUT Address;
                             Result          : OUT Integer);

   -- This is called when a select statment with a delay alternative(s)
   -- is executed.
   PROCEDURE Ts_Select_Delay (User_Entry_List : IN  A_Entry_Record_T;
                              Elist_Len       : IN  Integer;
                              Dlist_Len       : IN  Integer;
                              Param_Block     : OUT Address;
                              Result          : OUT Integer);

   -- This is called when a select statment with a terminate alternative
   -- is executed.  'termin_open' is true if the terminate alternative
   -- is open (i.e., if it has no guard or if its guard is true.
   PROCEDURE Ts_Select_Terminate (User_Entry_List : IN  A_Entry_Record_T;
                                  Elist_Len       : IN  Integer;
                                  Termin_Open     : IN  Integer;
                                  Param_Block     : OUT Address;
                                  Result          : OUT Integer);

   -- Called when the end of an accept body is reached.
   -- If an exception occurred in the body of the accept, the first
   -- paramenter is true and the second points to the string that
   -- describes the exception.
   PROCEDURE Ts_Finish_Accept (Exception_Occurred : IN Integer;
                               Exception_String   : IN Address);

   --------------------------------------------------------------------------
   -- RTS initialization and main procedure exit
   --------------------------------------------------------------------------

   -- This routine is called explicity by startup to set upt the RTS's
   -- internal data structures.
   PROCEDURE Ts_Initialize;

   -- This is called by the main procedure of a program when it wishes
   -- to complete the whole program.  This procedure is not called
   -- by generated code, it is the last entry in the elaboration table
   -- if it is to be called.
   PROCEDURE Ts_Exit;

   --------------------------------------------------------------------------
   -- Task, master and program creation
   --------------------------------------------------------------------------

   -- This creates a new Ada task.  The 'master' parameter is the master
   -- id (returned by 'ts_create_master') for the master of the task to
   -- be created.  'prio' is a priority in the range 1..10.  'stack_size'
   -- is the size of the stack area that the new task requires.  'start'
   -- is the address of the first instruction of the task's code.
   -- 'entry_count' is the number of entries that the new task has.
   FUNCTION Ts_Create_Task (Master        : IN A_Master_T;
                            Prio          : IN Integer;
                            Stack_Size    : IN Integer;
                            Start         : IN Address;
                            Entry_Count   : IN Integer;
                            Generic_Param : IN Address) RETURN A_Task_T;

   -- This is like 'ts_create_task' above, except that it also enters
   -- the task id of the new task in the activation table passed
   -- in the 'activate_list' parameter.  See the 'ts_activ' package.
   FUNCTION Ts_Create_Task_And_Link (Master : A_Master_T;
                                     Prio : Integer;
                                     Stack_Size : Integer;
                                     Start : Address;
                                     Entry_Count : Integer;
                                     Activation_List : A_Alist_T;
                                     Generic_Param : Address) RETURN A_Task_T;

   -- This returns an id to use in future calls to 'ts_create_task'
   -- 'ts_create_task_and_link', and 'ts_complete_master'.  The
   -- effect of this call is to create an internal RTS structure
   -- to keep track of the tasks for whom the current task is
   -- master.
   FUNCTION Ts_Create_Master RETURN A_Master_T;

   -- This returns the task id of the current task.
   FUNCTION Ts_Tid RETURN A_Task_T;

   -- This creates and activates a new ada program.  The first passed
   -- parameter is the address of the new program's link_block. The
   -- second parameter is a user defined key stored in the new program's
   -- control block. This key is passed to the PROGRAM_SWITCH_EVENT
   -- callouts. The key may be obtained by routines in the new
   -- program via v_i_tasks.get_program_key.
   -- This key can be used to point to a list of program arguments.
   -- The key for the main program is set to 0 (NO_ADDR). The third
   -- parameter is the address of a routine called when the program
   -- terminates. It can be set to NO_ADDR for no callout.
   --
   -- The terminate callout procedure is called as follows:
   --    procedure terminate_callout_proc(
   --\x09\x09prg:\x09\x09\x09a_program_t;-- program being terminated
   --      key:\x09\x09\x09address);\x09-- its corresponding user defined key
   --
   -- The terminate_callout_proc must be compiled with stack limit
   -- checking suppressed. The PROGRAM_SWITCH_EVENT callout isn't
   -- called before calling the terminate_callout_proc.
   --
   -- Note, if the program is terminated via v_i_tasks.terminate_program
   -- and if the program has tasks in rendezvous with tasks in other
   -- programs, then, the terminate_callout may be called after
   -- returning from v_i_tasks.terminate_program.
   --
   FUNCTION Ts_Create_Program
               (User_Link_Block_A : Address;
                Key               : Address := Memory_Address (1);
                Terminate_Callout : Address := No_Addr) RETURN A_Program_T;

   --------------------------------------------------------------------------
   -- Delay and current time
   --------------------------------------------------------------------------

   -- This returns after delaying for at least the amount of time
   -- specified by 'delay_val'.  'delay_val' is internal representation
   -- for duration, normally milliseconds.
   PROCEDURE Ts_Delay (Delay_Val : IN Duration);

   -- This returns the current time, wherein, duration_time has been
   -- normalized to be less than a day.
   PROCEDURE Ts_Current_Time (Day : OUT Day_T; Sec : OUT Duration);

   --------------------------------------------------------------------------
   -- Task and master completion/termination
   --------------------------------------------------------------------------

   -- This completes the calling task.  This never returns and
   -- the calling task never executes again.
   PROCEDURE Ts_Complete_Task;

   -- This waits for the completion of all of the tasks whose master
   -- is named by the master id passed.  Then the calling task
   -- is completed just as it is in 'ts_complete_task'.
   PROCEDURE Ts_Complete_Master (Master : IN A_Master_T);

   PROCEDURE Ts_Exception_Master (Master : IN A_Master_T);

   PROCEDURE Ts_Terminate_List (Activation_List : IN OUT A_Alist_T);

   --------------------------------------------------------------------------
   -- Interrupt Entry
   --------------------------------------------------------------------------

   -- Attaches interrupt entry in current task to signal that can be posted
   -- by interrupt handler
   PROCEDURE Ts_Attach_Interrupt
                (Interrupt_Entry : Integer; Signal_Code : Integer);

   -- Detaches all interrupt entries in passed task from signals.
   PROCEDURE Ts_Detach_Interrupt (Tsk : IN A_Task_T);

PRIVATE
   TYPE A_Master_T IS NEW Integer;
   TYPE A_Alist_T  IS NEW Integer;

   PRAGMA Interface (Ada, Ts_Abort);
   PRAGMA Interface_Name (Ts_Abort, "TS_ABORT");
   PRAGMA Iterface (Ada, Ts_Init_Activate_List);
   PRAGMA Interface_Name (Ts_Init_Activate_List, "TS_INIT_ACTIVATE_LIST");
   PRAGMA Interface (Ada, Ts_Activate_List);
   PRAGMA Interface_Name (Ts_Activate_List, "TS_ACTIVATE_LIST");
   PRAGMA Interface (Ada, Ts_Activate);
   PRAGMA Interface_Name (Ts_Activate, "TS_ACTIVATE");
   PRAGMA Interface (Ada, Ts_Activation_Complete);
   PRAGMA Interface_Name (Ts_Activation_Complete, "TS_ACTIVATION_COMPLETE");
   PRAGMA Interface (Ada, Ts_Activation_Exceptions);
   PRAGMA Interface_Name (Ts_Activation_Exceptions,
                          "TS_ACTIVATION_EXCEPTIONS");
   PRAGMA Interface (Ada, Ts_Callable);
   PRAGMA Interface_Name (Ts_Callable, "TS_CALLABLE");
   PRAGMA Interface (Ada, Ts_Terminated);
   PRAGMA Interface_Name (Ts_Terminated, "TS_TERMINATED");
   PRAGMA Interface (Ada, Ts_Entry_Count);
   PRAGMA Interface_Name (Ts_Entry_Count, "TS_ENTRY_COUNT");
   PRAGMA Interface (Ada, Ts_Call);
   PRAGMA Interface_Name (Ts_Call, "TS_CALL");
   PRAGMA Interface (Ada, Ts_Conditional_Call);
   PRAGMA Interface_Name (Ts_Conditional_Call, "TS_CONDITIONAL_CALL");
   PRAGMA Interface (Ada, Ts_Timed_Call);
   PRAGMA Interface_Name (Ts_Timed_Call, "TS_TIMED_CALL");
   PRAGMA Interface (Ada, Ts_Select);
   PRAGMA Interface_Name (Ts_Select, "TS_SELECT");
   PRAGMA Interface (Ada, Ts_Accept);
   PRAGMA Interface_Name (Ts_Accept, "TS_ACCEPT");
   PRAGMA Interface (Ada, Ts_Fast_Accept);
   PRAGMA Interface_Name (Ts_Fast_Accept, "TS_FAST_ACCEPT");
   PRAGMA Interface (Ada, Ts_Select_Else);
   PRAGMA Interface_Name (Ts_Select_Else, "TS_SELECT_ELSE");
   PRAGMA Interface (Ada, Ts_Select_Delay);
   PRAGMA Interface_Name (Ts_Select_Delay, "TS_SELECT_DELAY");
   PRAGMA Interface (Ada, Ts_Select_Terminate);
   PRAGMA Interface_Name (Ts_Select_Terminate, "TS_SELECT_TERMINATE");
   PRAGMA Interface (Ada, Ts_Finish_Accept);
   PRAGMA Interface_Name (Ts_Finish_Accept, "TS_FINISH_ACCEPT");
   PRAGMA Interface (Ada, Ts_Initialize);
   PRAGMA Interface_Name (Ts_Initialize, "TS_INITIALIZE");
   PRAGMA Interface (Ada, Ts_Exit);
   PRAGMA Interface_Name (Ts_Exit, "TS_EXIT");
   PRAGMA Interface (Ada, Ts_Create_Task);
   PRAGMA Interface_Name (Ts_Create_Task, "TS_CREATE_TASK");
   PRAGMA Interface (Ada, Ts_Create_Task_And_Link);
   PRAGMA Interface_Name (Ts_Create_Task_And_Link, "TS_CREATE_TASK_AND_LINK");
   PRAGMA Interface (Ada, Ts_Create_Master);
   PRAGMA Interface_Name (Ts_Create_Master, "TS_CREATE_MASTER");
   PRAGMA Interface (Ada, Ts_Tid);
   PRAGMA Interface_Name (Ts_Tid, "TS_TID");
   PRAGMA Interface (Ada, Ts_Create_Program);
   PRAGMA Interface_Name (Ts_Create_Program, "TS_CREATE_PROGRAM");
   PRAGMA Interface (Ada, Ts_Delay);
   PRAGMA Interface_Name (Ts_Delay, "TS_DELAY");
   PRAGMA Interface (Ada, Ts_Current_Time);
   PRAGMA Interface_Name (Ts_Current_Time, "TS_CURRENT_TIME");
   PRAGMA Interface (Ada, Ts_Complete_Task);
   PRAGMA Interface_Name (Ts_Complete_Task, "TS_COMPLETE_TASK");
   PRAGMA Interface (Ada, Ts_Complete_Master);
   PRAGMA Interface_Name (Ts_Complete_Master, "TS_COMPLETE_MASTER");
   PRAGMA Interface (Ada, Ts_Exception_Master);
   PRAGMA Interface_Name (Ts_Exception_Master, "TS_EXCEPTION_MASTER");
   PRAGMA Interface (Ada, Ts_Terminate_List);
   PRAGMA Interface_Name (Ts_Terminate_List, "TS_TERMINATE_LIST");
   PRAGMA Interface (Ada, Ts_Attach_Interrupt);
   PRAGMA Interface_Name (Ts_Attach_Interrupt, "TS_ATTACH_INTERRUPT");
   PRAGMA Interface (Ada, Ts_Detach_Interrupt);
   PRAGMA Interface_Name (Ts_Detach_Interrupt, "TS_DETACH_INTERRUPT");
END V_I_Taskop;


E3 Meta Data

    nblk1=15
    nid=0
    hdr6=2a
        [0x00] rec0=1e rec1=00 rec2=01 rec3=058
        [0x01] rec0=1c rec1=00 rec2=15 rec3=06c
        [0x02] rec0=00 rec1=00 rec2=02 rec3=02c
        [0x03] rec0=17 rec1=00 rec2=03 rec3=040
        [0x04] rec0=16 rec1=00 rec2=04 rec3=08c
        [0x05] rec0=14 rec1=00 rec2=05 rec3=004
        [0x06] rec0=12 rec1=00 rec2=06 rec3=072
        [0x07] rec0=14 rec1=00 rec2=07 rec3=02e
        [0x08] rec0=12 rec1=00 rec2=08 rec3=044
        [0x09] rec0=13 rec1=00 rec2=09 rec3=022
        [0x0a] rec0=13 rec1=00 rec2=0a rec3=030
        [0x0b] rec0=12 rec1=00 rec2=0b rec3=00a
        [0x0c] rec0=12 rec1=00 rec2=0c rec3=068
        [0x0d] rec0=15 rec1=00 rec2=0d rec3=072
        [0x0e] rec0=16 rec1=00 rec2=0e rec3=030
        [0x0f] rec0=1a rec1=00 rec2=0f rec3=016
        [0x10] rec0=00 rec1=00 rec2=14 rec3=002
        [0x11] rec0=12 rec1=00 rec2=10 rec3=04e
        [0x12] rec0=13 rec1=00 rec2=11 rec3=03a
        [0x13] rec0=13 rec1=00 rec2=12 rec3=060
        [0x14] rec0=0d rec1=00 rec2=13 rec3=000
    tail 0x21739b95e85657464de7f 0x489e0066482863c01