
*copyc OSD$DEFAULT_PRAGMATS
MODULE ifm$begin_end_handler;
*copyc jmp$restore_dispatching_control
*copyc jmv$jcb
*copyc jmv$system_job_ssn
?? PUSH (LISTEXT := ON) ??
*copyc ift$condition_codes
*copyc IFK$KEYPOINTS
*copyc PMP$GET_EXECUTING_TASK_GTID
*copyc OSP$SET_STATUS_ABNORMAL
*copyc OSP$APPEND_STATUS_INTEGER
*copyc OSP$APPEND_STATUS_PARAMETER
*copyc oss$task_shared
*copyc ift$$advance_repeat_types
*copyc ift$title_for_error_codes
*copyc ift$pause_util_dispatching_info
*copyc ift$pause_utility_count


  PROCEDURE [XREF] iip$discard_suspended_output;
?? POP ??

  VAR
    ifv$pause_util_dispatching_info: [oss$task_shared] ift$pause_util_dispatching_info,

    ifv$pause_utility_count: [XDCL, #GATE, oss$task_shared] ift$pause_utility_count := 0;

  PROCEDURE [XDCL, #GATE] ifp$discard_suspended_output;

    iip$discard_suspended_output;

  PROCEND ifp$discard_suspended_output;


  PROCEDURE [XDCL, #GATE] ifp$advance (count: ift$advance_count_range;
        unit: ift$advance_unit;
    VAR status: ost$status);

    #KEYPOINT (osk$entry, 0, ifk$advance);
    status.normal := TRUE;
    CASE unit OF
    = ifc$advance_all_queued_output =
      iip$discard_suspended_output;
    ELSE
      osp$set_status_abnormal (ifc$interactive_facility_id,
            ife$unknown_advance_unit, '', status);
      osp$append_status_integer (osc$status_parameter_delimiter, ORD (unit),
            10, FALSE, status);
      osp$append_status_parameter (osc$status_parameter_delimiter,
        'IFP$ADVANCE', status);
    CASEND;
    #KEYPOINT (osk$exit, 0, ifk$advance);

  PROCEND ifp$advance;

  PROCEDURE [XDCL, #GATE] ifp$begin_pause_utility (VAR status: ost$status);

{  PURPOSE:
{    This procedure saves the job's current dispatching control information, updates the pause utility
{    count, and resets the job's dispatching control information as is done for interactive input.
{    Do NOT save and restore dispatching control information for the system job (the system job
{    dispatching priority should never be changed.

    status.normal := TRUE;

    IF jmv$jcb.system_name <> jmv$system_job_ssn THEN
      ifv$pause_util_dispatching_info [ifv$pause_utility_count].dispatching_control_index := jmv$jcb.ijle_p^.
            dispatching_control.dispatching_control_index;
      ifv$pause_util_dispatching_info [ifv$pause_utility_count].dispatching_priority := jmv$jcb.ijle_p^.
            scheduling_dispatching_priority;
      ifv$pause_util_dispatching_info [ifv$pause_utility_count].service_remaining := jmv$jcb.ijle_p^.
            dispatching_control.service_remaining;
    IFEND;

    ifv$pause_utility_count := ifv$pause_utility_count + 1;

  PROCEND ifp$begin_pause_utility;

  PROCEDURE [XDCL, #GATE] ifp$end_pause_utility (VAR status: ost$status);

{  PURPOSE:
{    This procedure decrements the pause utility count and issues a call to restore the job's
{    dispatching control iformation to what it was before the user entered the pause utility.
{    Do NOT save and restore dispatching control information for the system job (the system job
{    dispatching priority should never be changed.

    status.normal := TRUE;

    ifv$pause_utility_count := ifv$pause_utility_count - 1;

    IF jmv$jcb.system_name <> jmv$system_job_ssn THEN
      jmp$restore_dispatching_control (ifv$pause_util_dispatching_info [ifv$pause_utility_count]);
    IFEND;

  PROCEND ifp$end_pause_utility;

MODEND ifm$begin_end_handler
