*copyc osd$default_pragmats
MODULE iim$flush;
?? TITLE := 'MODULE iim$flush' ??

?? PUSH (LISTEXT := OFF) ??
*copyc ife$error_codes
*copyc iik$keypoints
*copyc iit$interactive_signal_type
*copyc iit$connection_description
*copyc iip$clear_lock
*copyc iiv$interactive_terminated
*copyc iip$put
*copyc iip$report_status_error
*copyc iip$set_lock
*copyc iip$send_output_message
*copyc iiv$int_task_open_file_count
*copyc iiv$connection_desc_ptr
*copyc ost$status
*copyc osp$set_status_abnormal
*copyc osp$test_sig_lock
*copyc osp$establish_condition_handler
*copyc osp$clear_job_signature_lock
*copyc pmp$continue_to_cause
*copyc pmp$log
*copyc iip$check_if_status
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$flush', EJECT ??

  PROCEDURE [XDCL, #GATE] iip$flush (file_id: amt$file_identifier;
        open_file_desc_pointer: ^iit$open_file_description;
    VAR status: ost$status);

    VAR
      ls: ost$signature_lock_status,
      local_status: ost$status;

?? NEWTITLE := 'PROCEDURE handle_break', EJECT ??

    PROCEDURE handle_break (cond: pmt$condition;
          cd: ^pmt$condition_information;
          sa: ^ost$stack_frame_save_area;
      VAR ch_status: ost$status);

      VAR
        local_status: ost$status;

{ return to screen with abnormal status

      pmp$continue_to_cause (pmc$execute_standard_procedure, local_status);

      IF cond.selector = ifc$interactive_condition THEN
        CASE cond.interactive_condition OF
        = ifc$pause_break =
          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$pause_break_received, '', status);
        = ifc$terminate_break =
          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$terminate_break_received, '', status);
        = ifc$terminal_connection_broken =
          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$connection_break_disconnect, '', status);
        = ifc$job_reconnect =
          osp$set_status_abnormal (ifc$interactive_facility_id,
                ife$terminal_reconnected_to_job, '', status);
        ELSE
          osp$set_status_abnormal (ifc$interactive_facility_id, 0,
            'unknown interactive condition encountered', status);
        CASEND;

        EXIT iip$flush;
      IFEND;

    PROCEND handle_break;
?? OLDTITLE ??
?? EJECT ??

    iip$check_if_status (status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    osp$test_sig_lock (iiv$downline_queue_lock, ls);
    IF ls = osc$sls_locked_by_current_task THEN

{     some sort of unintended recursion has occured. ignore flush.

      status.normal := TRUE;
      RETURN;
    IFEND;

    osp$establish_condition_handler (^handle_break, FALSE);

    IF iiv$put_info.last_term_option <> amc$terminate THEN

    { Add the contents of the buffer used for put-partial data to the downline queue.

      iip$put (file_id, open_file_desc_pointer, amc$put_partial_req,
            NIL, 0, NIL, amc$terminate, status);
      IF NOT status.normal THEN
        pmp$log (' IIP$PUT returned bad status in IIP$FLUSH', status);
      IFEND;
    IFEND;

  /empty_the_downline_queue/
    WHILE TRUE DO
      iip$set_lock (iiv$downline_queue_lock, osc$wait, local_status);
      IF iiv$downline_queue_count = 0 THEN
        iip$clear_lock (iiv$downline_queue_lock, local_status);
        EXIT /empty_the_downline_queue/;
      ELSE
        iip$clear_lock (iiv$downline_queue_lock, status);
        iip$send_output_message (TRUE, status);
        IF NOT status.normal THEN
          RETURN;
        IFEND;
      IFEND;
    WHILEND /empty_the_downline_queue/;

    status.normal := TRUE;

  PROCEND iip$flush;

MODEND iim$flush;
