MODULE pfm$task_termination;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced By this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc pfc$catalog_ring
?? POP ??
*copyc fmp$unlock_path_table
*copyc mmp$close_segment
*copyc mmp$unlock_segment
*copyc mmp$verify_access
*copyc osp$disestablish_cond_handler
*copyc osp$establish_condition_handler
*copyc osp$test_signature_lock
*copyc pfp$release_locked_apfid
*copyc pfp$return_catalog
*copyc pmp$continue_to_cause
*copyc pfv$locked_apfid
*copyc pfv$locked_catalog_list
?? OLDTITLE ??
?? NEWTITLE := 'PROCEDURE [XDCL] pfp$task_termination_cleanup', EJECT ??

  PROCEDURE [XDCL, #GATE] pfp$task_termination_cleanup;

    VAR
      i: integer,
      ignore_status: ost$status,
      lock_status: ost$signature_lock_status,
      pva: ^cell,
      segment_pointer: mmt$segment_pointer,
      p_catalog_locator: ^pft$catalog_locator;

?? NEWTITLE := 'task_cleanup_handler', EJECT ??

    PROCEDURE task_cleanup_handler
      (    condition: pmt$condition;
           condition_descriptor: ^pmt$condition_information;
           save_area: ^ost$stack_frame_save_area;
       VAR status: ost$status);

      status.normal := TRUE;

      CASE condition.selector OF
      = pmc$block_exit_processing, pmc$system_conditions, mmc$segment_access_condition =
        EXIT pfp$task_termination_cleanup; {----->

      ELSE
        pmp$continue_to_cause (pmc$execute_standard_procedure, status);
      CASEND;

    PROCEND task_cleanup_handler;
?? OLDTITLE ??
?? EJECT ??

    osp$establish_condition_handler (^task_cleanup_handler, TRUE);

    FOR i := 1 TO UPPERBOUND (pfv$locked_catalog_list) DO
      IF pfv$locked_catalog_list [i] <> NIL THEN
        pva := #ADDRESS (2, #SEGMENT (pfv$locked_catalog_list [i]), #OFFSET (pfv$locked_catalog_list [i]));
        IF mmp$verify_access (^pva, mmc$va_read_write) THEN
          mmp$unlock_segment (pva, mmc$lus_free, osc$nowait, ignore_status);
          segment_pointer.kind := mmc$cell_pointer;
          segment_pointer.cell_pointer := pva;
          mmp$close_segment (segment_pointer, pfc$catalog_ring, ignore_status);
          pfv$locked_catalog_list [i] := NIL;
        IFEND;
      IFEND;
    FOREND;

    osp$test_signature_lock (fmv$path_table_lock, lock_status);
    IF lock_status = osc$sls_locked_by_current_task THEN
      fmp$unlock_path_table;
    IFEND;

    IF pfv$locked_apfid <> 0 THEN
      pfp$release_locked_apfid (pfv$locked_apfid, ignore_status);
      pfv$locked_apfid := 0;
    IFEND;

    osp$disestablish_cond_handler;

  PROCEND pfp$task_termination_cleanup;
?? OLDTITLE ??
MODEND pfm$task_termination;
