?? TITLE := 'NOS/VE :  Basic Access Method : Close File' ??
MODULE fsm$close_file;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc amc$condition_code_limits
*copyc ame$improper_file_id
*copyc amt$fap_declarations
?? POP ??
*copyc baf$task_file_entry_p
*copyc amp$set_file_instance_abnormal
*copyc amp$terminate_file
*copyc bap$close
*copyc bap$mark_fap_layer_closed
*copyc osp$copy_local_status_to_status
*copyc osp$enforce_exception_policies
*copyc osp$file_access_condition
*copyc osp$set_status_abnormal
*copyc osv$initial_exception_context
?? TITLE := 'PROCEDURE [XDCL, #GATE] amp$close', EJECT ??
*copyc amh$also
*copyc amh$close

  PROCEDURE [XDCL, #GATE] amp$close
    (    file_identifier: amt$file_identifier;
     VAR status: ost$status);

    status.normal := TRUE;
    fsp$close_file (file_identifier, status);

  PROCEND amp$close;

?? TITLE := 'PROCEDURE [XDCL, #GATE, INLINE] fsp$close_file', EJECT ??
*copyc amh$also
*copyc fsh$close_file
?? EJECT ??

  PROCEDURE [XDCL, #GATE, INLINE] fsp$close_file
    (    file_identifier: amt$file_identifier;
     VAR status: ost$status);

    CONST
      interface_name = 'FSP$CLOSE_FILE',
      fap_layer_number = 0;

    VAR
      bam_status: ost$status,
      context: ^ost$ecp_exception_context,
      call_block: amt$call_block,
      file_instance: ^bat$task_file_entry;

    status.normal := TRUE;
    bam_status.normal := TRUE;
    context := NIL;

    file_instance := baf$task_file_entry_p (file_identifier);

    IF file_instance = NIL THEN
      osp$set_status_abnormal (amc$access_method_id, ame$improper_file_id, interface_name, status);
      RETURN; {----->
    IFEND;

    IF file_instance^.fap_control_information.first_fap.layer_closed = FALSE THEN
      amp$terminate_file (file_identifier, file_instance^);
      bap$mark_fap_layer_closed (file_identifier, fap_layer_number, bam_status);
      IF bam_status.normal THEN
        call_block.operation := amc$close_req;
        file_instance^.fap_control_information.first_fap.access_method^
              (file_identifier, call_block, fap_layer_number, bam_status);
        IF osp$file_access_condition (bam_status) THEN
          IF context = NIL THEN
            PUSH context;
            context^ := osv$initial_exception_context;
            context^.file.selector := osc$ecp_file_identifier;
            context^.file.file_identifier := file_identifier;
          IFEND;
          REPEAT
            context^.condition_status := bam_status;
            osp$enforce_exception_policies (context^);
            bam_status := context^.condition_status;
            IF context^.wait THEN
              file_instance^.fap_control_information.first_fap.
                    access_method^ (file_identifier, call_block, fap_layer_number, bam_status);
            IFEND;
          UNTIL bam_status.normal OR (NOT context^.wait);
        IFEND;
      ELSE
        amp$set_file_instance_abnormal (file_identifier, bam_status.condition, amc$close_req,
              bam_status.text.value, status);
      IFEND;
    ELSE {fap layers never called during the open process}
      bap$close (file_identifier, bam_status);
      IF osp$file_access_condition (bam_status) THEN
        IF context = NIL THEN
          PUSH context;
          context^ := osv$initial_exception_context;
          context^.file.selector := osc$ecp_file_identifier;
          context^.file.file_identifier := file_identifier;
        IFEND;
        REPEAT
          context^.condition_status := bam_status;
          osp$enforce_exception_policies (context^);
          bam_status := context^.condition_status;
          IF context^.wait THEN
            bap$close (file_identifier, bam_status);
          IFEND;
        UNTIL bam_status.normal OR (NOT context^.wait);
      IFEND;
    IFEND;
    osp$copy_local_status_to_status (bam_status, status);

  PROCEND fsp$close_file;
MODEND fsm$close_file;



