?? RIGHT := 110 ??
*copyc OSD$DEFAULT_PRAGMATS
?? NEWTITLE := 'NOS/VE Device Management' ??
?? NEWTITLE := '  Module Header' ??
MODULE dmm$log_testing_commands ALIAS 'DMMLTST';
{ PURPOSE:
{
{
{ DESIGN:
{
{

?? PUSH (LISTEXT := ON) ??
?? TITLE := '  Declarations', EJECT ??
*copyc rmd$volume_declarations
*copyc dmt$device_log_entries
*copyc dmt$error_condition_codes
*copyc gft$system_file_identifier
*copyc ost$status
?? POP ??
*copyc dmp$process_device_log_entry
*copyc dmp$search_active_volume_table
*copyc osp$set_status_abnormal
*copyc gfv$null_sfid
?? TITLE := '  XREF Procedures', EJECT ??
?? TITLE := '  XREF Variables', EJECT ??

  VAR
    dmv$system_abort_log_entries: array [dmt$system_abort_log_positions] of dmt$system_log_aborts :=
      [$dmt$system_log_aborts [dmc$dl_sa_on_dl_entry, dmc$dl_sa_after_process_dl], $dmt$system_log_aborts
      [dmc$dl_sa_bef_next_dfl_change, dmc$dl_sa_aft_next_dfl_change, dmc$dl_sa_bef_next_dat_change,
      dmc$dl_sa_aft_next_dat_change, dmc$dl_sa_bef_logging_dtu], $dmt$system_log_aborts
      [dmc$dl_sa_bef_mf_table_update, dmc$dl_sa_aft_mf_table_update], $dmt$system_log_aborts []],
    dmv$recovery_abort_log_entries: ARRAY [dmt$recovry_abort_log_positions] of dmt$recovery_log_aborts :=
      [$dmt$recovery_log_aborts [dmc$dl_ra_on_dl_entry, dmc$dl_ra_after_process_dl], $dmt$recovery_log_aborts
      [dmc$dl_ra_bef_next_dfl_change, dmc$dl_ra_aft_next_dfl_change, dmc$dl_ra_bef_next_dat_change,
      dmc$dl_ra_aft_next_dat_change, dmc$dl_ra_bef_logging_dtu], $dmt$recovery_log_aborts [],
      $dmt$recovery_log_aborts []];

?? TITLE := '  dmp$create_volume_log_entry', EJECT ??

  PROCEDURE [XDCL] dmp$create_volume_log_entry ALIAS 'dmxcvle' (log_entry_type: dmt$dl_entry_kind;
        sfid: gft$system_file_identifier;
    VAR log_entry: dmt$dl_entry;
    VAR status: ost$status);

    status.normal := TRUE;

    log_entry.kind := dmc$invalid_dl_entry;

    IF (sfid <> gfv$null_sfid) THEN
      osp$set_status_abnormal (dmc$device_manager_ident, dme$invalid_device_log_kind,
        'sfid processing unsupported - DMMLTST', status);
      RETURN;
    IFEND;

    CASE log_entry_type OF

    = dmc$dl_sa_on_dl_entry =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_after_process_dl =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_bef_next_dfl_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_aft_next_dfl_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_bef_next_dat_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_aft_next_dat_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_bef_logging_dtu =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_bef_mf_table_update =
      log_entry.kind := log_entry_type;

    = dmc$dl_sa_aft_mf_table_update =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_on_dl_entry =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_after_process_dl =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_bef_next_dfl_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_aft_next_dfl_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_bef_next_dat_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_aft_next_dat_change =
      log_entry.kind := log_entry_type;

    = dmc$dl_ra_bef_logging_dtu =
      log_entry.kind := log_entry_type;

    ELSE
      osp$set_status_abnormal (dmc$device_manager_ident, dme$invalid_device_log_kind,
        'illegal log entry type - DMMLTST', status);
      RETURN;

    CASEND;
  PROCEND dmp$create_volume_log_entry;
?? TITLE := '  dmp$insert_volume_log_entry', EJECT ??

  PROCEDURE [XDCL] dmp$insert_volume_log_entry ALIAS 'dmxivle' (recorded_vsn: rmt$recorded_vsn;
        log_entry: dmt$dl_entry;
    VAR status: ost$status);

    VAR
      search_key: dmt$avt_search_key,
      avt_index: dmt$active_volume_table_index,
      vsn_not_active: boolean;

    search_key.value := dmc$search_avt_by_rec_vsn;
    search_key.recorded_vsn := recorded_vsn;

    dmp$search_active_volume_table (search_key, avt_index, vsn_not_active);
    IF vsn_not_active THEN
      osp$set_status_abnormal (dmc$device_manager_ident, dme$unable_to_locate_avt_entry,
        'vsn not active _ DMMLTST', status);
      RETURN;
    IFEND;
    dmp$process_device_log_entry (avt_index, log_entry, status);

  PROCEND dmp$insert_volume_log_entry;
?? TITLE := '  dmp$get_logging_abort_positions', EJECT ??

  PROCEDURE [XDCL] dmp$get_logging_abort_positions ALIAS 'dmxglap' (abort_type: dmt$abort_log_types;
    VAR number_of_abort_positions: integer;
    VAR abort_positions: array [ * ] OF dmt$abort_log_positions;
    VAR status: ost$status);

    VAR
      index: integer,
      system_position_abort: dmt$system_abort_log_positions,
      recovery_position_abort: dmt$recovry_abort_log_positions;

    status.normal := TRUE;

    CASE abort_type OF

    = dmc$system_abort =
      system_position_abort := LOWERVALUE (dmt$system_abort_log_positions);

    /get_system_abort_positions/
      FOR index := LOWERBOUND (abort_positions) TO UPPERBOUND (abort_positions) DO
        abort_positions [index] := system_position_abort;
        IF (UPPERVALUE (dmt$system_abort_log_positions) = system_position_abort) THEN
          EXIT /get_system_abort_positions/;
        IFEND;
        system_position_abort := SUCC (system_position_abort);
      FOREND /get_system_abort_positions/;

      number_of_abort_positions := (ORD (UPPERVALUE (dmt$system_abort_log_positions)) - ORD (LOWERVALUE
            (dmt$system_abort_log_positions))) + 1;

    = dmc$recovery_abort =

      recovery_position_abort := LOWERVALUE (dmt$recovry_abort_log_positions);

    /get_recovery_abort_positions/
      FOR index := LOWERBOUND (abort_positions) TO UPPERBOUND (abort_positions) DO
        abort_positions [index] := recovery_position_abort;
        IF (UPPERVALUE (dmt$recovry_abort_log_positions) = recovery_position_abort) THEN
          EXIT /get_recovery_abort_positions/;
        IFEND;
        recovery_position_abort := SUCC (recovery_position_abort);
      FOREND /get_recovery_abort_positions/;

      number_of_abort_positions := (ORD (UPPERVALUE (dmt$recovry_abort_log_positions)) - ORD (LOWERVALUE
            (dmt$recovry_abort_log_positions))) + 1;

    ELSE
      osp$set_status_abnormal (dmc$device_manager_ident, dme$invalid_device_log_kind,
        'unsupported log abort type - DMMLTST', status);
      RETURN;
    CASEND;

  PROCEND dmp$get_logging_abort_positions;
?? TITLE := '  dmp$get_logging_abort_entries', EJECT ??

  PROCEDURE [XDCL] dmp$get_logging_abort_entries ALIAS 'dmxglae' (abort_location: dmt$log_abort;
    VAR number_of_abort_log_entries: integer;
    VAR abort_log_entries: array [ * ] OF dmt$dl_entry_kind;
    VAR status: ost$status);

    VAR
      abort_type: dmt$abort_log_types,
      abort_position: dmt$abort_log_positions,
      abort_dl_entry: dmt$dl_entry_kind,
      index: integer;

    status.normal := TRUE;

    number_of_abort_log_entries := 0;

    CASE abort_location.abort OF

    = dmc$system_abort =
      abort_type := abort_location.abort;

    = dmc$recovery_abort =
      abort_type := abort_location.abort;

    ELSE
      osp$set_status_abnormal (dmc$device_manager_ident, dme$invalid_device_log_kind,
        'unsupported log abort type - DMMLTST', status);
      RETURN;
    CASEND;

    index := LOWERBOUND (abort_log_entries);

    CASE abort_type OF

    = dmc$system_abort =
      abort_position := abort_location.system_abort_position;
      FOR abort_dl_entry := LOWERVALUE (dmt$system_abort_log_entries) TO UPPERVALUE
            (dmt$system_abort_log_entries) DO
        IF (abort_dl_entry IN dmv$system_abort_log_entries [abort_position]) THEN
          number_of_abort_log_entries := number_of_abort_log_entries + 1;
          IF (index <= UPPERBOUND (abort_log_entries)) THEN
            abort_log_entries [index] := abort_dl_entry;
            index := index + 1;
          IFEND;
        IFEND;
      FOREND;

    = dmc$recovery_abort =
      FOR abort_dl_entry := LOWERVALUE (dmt$recovery_abort_log_entries) TO UPPERVALUE
            (dmt$recovery_abort_log_entries) DO
        IF (abort_dl_entry IN dmv$recovery_abort_log_entries [abort_position]) THEN
          number_of_abort_log_entries := number_of_abort_log_entries + 1;
          IF (index <= UPPERBOUND (abort_log_entries)) THEN
            abort_log_entries [index] := abort_dl_entry;
            index := index + 1;
          IFEND;
        IFEND;
      FOREND;

    CASEND;

  PROCEND dmp$get_logging_abort_entries;

MODEND dmm$log_testing_commands;
