*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$clear_job_locks;
?? TITLE := 'MODULE iim$clear_job_locks' ??

?? PUSH (LISTEXT := ON) ??
*copyc iiv$connection_desc_ptr
*copyc iiv$interactive_terminated
*copyc iiv$io_requests_in_job
*copyc iiv$io_requests_in_task
*copyc iiv$xt_xterm_control_block
*copyc jmv$timesharing_job
*copyc jmv$xterm_job
*copyc osp$clear_job_signature_lock
*copyc osp$decrement_locked_variable
*copyc osp$test_sig_lock
*copyc pmp$log
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$clear_job_locks' ??

  PROCEDURE [XDCL, #GATE] iip$clear_job_locks (VAR status: ost$status);

    VAR
      decrement_error: boolean,
      io_requests_in_job: integer,
      ls: ost$signature_lock_status,
      local_status: ost$status;

    status.normal := TRUE;

    IF jmv$timesharing_job or jmv$xterm_job THEN
      WHILE iiv$io_requests_in_task > 0 DO
        iiv$io_requests_in_task := iiv$io_requests_in_task - 1;
        osp$decrement_locked_variable (iiv$io_requests_in_job, iiv$io_requests_in_job,
              io_requests_in_job, decrement_error);
      WHILEND;
    IFEND;

    osp$test_sig_lock (iiv$get_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN
      iiv$get_info.position_in_block := 1;
      iiv$get_info.file_position := amc$eor;
      osp$clear_job_signature_lock (iiv$get_lock);
      pmp$log ('task exit - iiv$get_lock cleared', local_status);
    IFEND;

    osp$test_sig_lock (iiv$downline_queue_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN
      osp$clear_job_signature_lock (iiv$downline_queue_lock);
      pmp$log ('task exit - iiv$downline_queue_lock cleared', local_status);
    IFEND;

    osp$test_sig_lock (iiv$interactive_task_count_lock, ls);

    IF ls = osc$sls_locked_by_current_task THEN
      osp$clear_job_signature_lock (iiv$interactive_task_count_lock);
      pmp$log ('task exit - iiv$interactive_task_count_lock cleared',
        local_status);
    IFEND;

    osp$test_sig_lock (iiv$connection_desc_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN
      osp$clear_job_signature_lock (iiv$connection_desc_lock);
      pmp$log ('task exit - iiv$connection_desc_lock cleared', local_status);
    IFEND;

    osp$test_sig_lock (iiv$xt_xterm_control_block.upline_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN
      osp$clear_job_signature_lock (iiv$xt_xterm_control_block.upline_lock);
    IFEND;

    osp$test_sig_lock (iiv$xt_xterm_control_block.downline_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN
      osp$clear_job_signature_lock (iiv$xt_xterm_control_block.downline_lock);
    IFEND;
  PROCEND iip$clear_job_locks;

MODEND iim$clear_job_locks;
