?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Deadstart : Manage SSR Routines Monitor' ??
MODULE dsm$mtr_manage_ssr_routines;

{ PURPOSE:
{   This module contains the monitor procedures that are used to manage the system status record (SSR) areas.
{ NOTE:
{   There is a corresponding module in system_core that manages the SSR routines.  Any changes made to this
{   module may also need to be made to the module dsm$manage_ssr_routines.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cyd$cybil_structure_definitions
*copyc dst$deadstart_sequence_steps
*copyc dst$ssr_data_types
?? POP ??
*copyc mtp$error_stop
?? TITLE := 'Global Declarations Declared by This Module', EJECT ??
  VAR
    v$ssr_directory_seq_p: ^SEQ ( * ) := NIL,
    v$ssr_seq_p: ^SEQ ( * ) := NIL;
?? TITLE := 'get_entry_from_ssr', EJECT ??

{ PURPOSE:
{   This procedure retrieves an entry from the SSR.

  PROCEDURE get_entry_from_ssr
    (    ssr_entry_name: dst$ssr_entry_name;
     VAR ssr_entry_p: ^dst$ssr_entry);

    VAR
      seq_header_p: ^cyt$sequence_pointer,
      ssr_seq_p: ^SEQ ( * );

    IF v$ssr_directory_seq_p = NIL THEN
      seq_header_p := #LOC (v$ssr_directory_seq_p);
      seq_header_p^.pva := #ADDRESS (1, dsc$ssr_segment_number, dsc$ssr_offset);
      seq_header_p^.length := 2000(16);
      seq_header_p^.nextt := 0;
    IFEND;

    ssr_seq_p := v$ssr_directory_seq_p;
    RESET ssr_seq_p;
    REPEAT
      NEXT ssr_entry_p IN ssr_seq_p;
      IF (ssr_entry_p <> NIL) AND (ssr_entry_p^.name = ssr_entry_name) THEN
        RETURN;
      IFEND;
    UNTIL ssr_entry_p = NIL;
    mtp$error_stop (' Entry is not defined in the SSR');

  PROCEND get_entry_from_ssr;
?? TITLE := 'dsp$advance_ds_sequence_in_mtr', EJECT ??

{ PURPOSE:
{   This procedure is used to advance the deadstart sequence step in monitor mode.

  PROCEDURE [XDCL] dsp$advance_ds_sequence_in_mtr
    (    sequence_step: dst$deadstart_sequence_steps);

    VAR
      byve_p: ^dst$ssr_entry,
      sdst_p: ^dst$ssr_entry;

    CASE sequence_step OF
    = dsc$dss_system_terminated =
      get_entry_from_ssr (dsc$ssr_termination_status, byve_p);
      byve_p^.right_slot := $INTEGER (sequence_step);
    ELSE
      { do nothing
    CASEND;

    { Save the step of the current deadstart sequence in the SSR.

    get_entry_from_ssr (dsc$ssr_deadstart_state, sdst_p);
    sdst_p^.left_slot := $INTEGER (sequence_step);

  PROCEND dsp$advance_ds_sequence_in_mtr;
?? TITLE := 'dsp$mtr_get_ssr_data_seq_ptr', EJECT ??

{ PURPOSE:
{   This procedure retrieves a pointer to specific data in the SSR.

  PROCEDURE [XDCL] dsp$mtr_get_ssr_data_seq_ptr
    (    ssr_entry_name: dst$ssr_entry_name;
     VAR ssr_data_seq_p: ^SEQ ( * ));

    VAR
      seq_header_p: ^cyt$sequence_pointer,
      skip_seq_p: ^SEQ ( * ),
      ssr_entry_p: ^dst$ssr_entry,
      ssr_seq_p: ^SEQ ( * );

    get_entry_from_ssr (ssr_entry_name, ssr_entry_p);

    IF v$ssr_seq_p = NIL THEN
      seq_header_p := #LOC (v$ssr_seq_p);
      seq_header_p^.pva := #ADDRESS (1, dsc$ssr_segment_number, dsc$ssr_offset);
      seq_header_p^.length := 100000(16);
      seq_header_p^.nextt := 0;
    IFEND;

    ssr_seq_p := v$ssr_seq_p;
    RESET ssr_seq_p;
    IF ssr_entry_p^.right_slot > 0 THEN
      NEXT skip_seq_p: [[REP ssr_entry_p^.right_slot OF integer]] IN ssr_seq_p;
    IFEND;
    NEXT ssr_data_seq_p: [[REP ssr_entry_p^.left_slot OF integer]] IN ssr_seq_p;
    RESET ssr_data_seq_p;

  PROCEND dsp$mtr_get_ssr_data_seq_ptr;
MODEND dsm$mtr_manage_ssr_routines;
