?? RIGHT := 110 ??
?? NEWTITLE := 'dmm$mtr_recover_job_dm_tables' ??
MODULE dmm$mtr_recover_job_dm_tables;

?? PUSH (LISTEXT := ON) ??
*copyc jmt$job_control_block
?? POP ??
*copyc dmp$get_disk_file_descriptor_p
*copyc dmp$get_fmd_by_index
*copyc dmp$search_avt_by_vsn
*copyc gfp$mtr_scan_all_fdes
*copyc mtp$error_stop
*copyc dmv$active_volume_table
*copyc mmv$ast_p

  VAR
    syv$job_recovery_fde_fixup: [XDCL] integer := 0;

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

  PROCEDURE [XDCL] dmp$recover_job_dm_tables
    (    ijle_p: ^jmt$initiated_job_list_entry);

    VAR
      avt_index: dmt$active_volume_table_index,
      fmd_number: dmt$fmd_index,
      found: boolean,
      number_of_fmds: dmt$fmd_index,
      p_dfd: ^dmt$disk_file_descriptor,
      p_fde: ^gft$file_descriptor_entry,
      p_fmd: ^dmt$file_medium_descriptor,
      scan_control: gft$scan_all_fdes_state;

    gfp$mtr_scan_all_fdes (gfc$tr_job, ijle_p, scan_control, p_fde);

    WHILE p_fde <> NIL DO

      IF p_fde^.media = gfc$fm_mass_storage_file THEN
        dmp$get_disk_file_descriptor_p (p_fde, p_dfd);
        IF p_dfd^.read_write_count <> 0 THEN
          p_dfd^.read_write_count := 0;
          syv$job_recovery_fde_fixup := syv$job_recovery_fde_fixup + 1;
        IFEND;

        number_of_fmds := p_dfd^.number_of_fmds;
        FOR fmd_number := 1 TO number_of_fmds DO
          dmp$get_fmd_by_index (p_dfd, fmd_number, p_fmd);
          IF (p_fmd <> NIL) AND (p_fmd^.in_use) AND (p_fmd^.volume_assigned) THEN
            dmp$search_avt_by_vsn (p_fmd^.internal_vsn, avt_index, found);
            IF found THEN
              p_fmd^.avt_index := avt_index;
            ELSE
              mtp$error_stop ('Cannot find volume for recovering job');
            IFEND;
          IFEND;
        FOREND;
      IFEND;

{  The following check is required in the event that job recovery is being attempted
{  on a system which has less memory than the previous deadstart. If this segment had
{  an  AST entry which is greater than the current AST length, a new entry must be made.
{  An asti of zero is stored in the FDE.

      IF (p_fde^.asti > UPPERBOUND (mmv$ast_p^)) THEN
        p_fde^.asti := 0;
      IFEND;

      p_fde^.segment_lock.locked_for_read := 0;
      p_fde^.segment_lock.locked_for_write := FALSE;
      p_fde^.segment_lock.task_queue.head := 0;
      p_fde^.segment_lock.task_queue.tail := 0;

      gfp$mtr_scan_all_fdes (gfc$tr_null_residence, ijle_p, scan_control, p_fde);
    WHILEND;

  PROCEND dmp$recover_job_dm_tables;
MODEND dmm$mtr_recover_job_dm_tables;

