MODULE bam$system_tape_label_fap_ring2;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc bat$tape_descriptor
?? POP ??
*copyc cmp$get_element_name_via_lun
*copyc iop$tape_request_status
*copyc iop$unload_tape
*copyc rmp$clear_implicit_reserve
*copyc rmp$deactivate_volume
*copyc dmv$initialize_tape_volume
*copyc dmv$tape_job_lun_table_p
*copyc fmv$default_detachment_options
*copyc osv$job_pageable_heap
*copyc osv$task_private_heap
*copyc osv$task_shared_heap
*copyc rmv$job_tape_table_p
?? OLDTITLE ??
?? NEWTITLE := ' [xdcl, #gate] BAP$DISMOUNT_TAPE_VOLUME', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$dismount_tape_volume
    (    sfid: gft$system_file_identifier;
     VAR status: ost$status);

    VAR
      detachment_options: fmt$detachment_options,
      io_status: iot$tape_io_status,
      ioid: iot$io_id;

    detachment_options := fmv$default_detachment_options;
    detachment_options.device_class := rmc$magnetic_tape_device;
    detachment_options.physical_unload := TRUE;

    iop$unload_tape (sfid, detachment_options, ioid, status);

    IF status.normal THEN
      iop$tape_request_status (sfid, ioid, {wait} TRUE, io_status, status);
    IFEND;

    rmp$deactivate_volume (sfid, {delete_request_from_vsn_queue} TRUE, status);

    IF (NOT dmv$initialize_tape_volume.in_progress) AND (NOT rmv$job_tape_table_p^.explicit_reservation) THEN
      rmp$clear_implicit_reserve (dmv$tape_job_lun_table_p^.tape_file^ [sfid.file_entry_index].density,
            status);
    IFEND;

  PROCEND bap$dismount_tape_volume;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] bap$get_tape_element_name', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$get_tape_element_name
    (    sfid: gft$system_file_identifier;
     VAR element_name: cmt$element_name;
     VAR status: ost$status);

    cmp$get_element_name_via_lun (dmv$tape_job_lun_table_p^.tape_file^ [sfid.file_entry_index].lun,
          element_name, status);

  PROCEND bap$get_tape_element_name;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] bap$free_tape_label_sequences', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$free_tape_label_sequences
    (    free_initial_volume_sequence: boolean;
     VAR p_tape_descriptor: ^bat$tape_descriptor);

    IF free_initial_volume_sequence AND (p_tape_descriptor^.initial_volume.header_labels <> NIL) THEN
      FREE p_tape_descriptor^.initial_volume.header_labels IN osv$job_pageable_heap^;
    IFEND;

    IF (p_tape_descriptor^.last_accessed.unsecured_header_labels <> NIL) THEN
      FREE p_tape_descriptor^.last_accessed.unsecured_header_labels IN osv$job_pageable_heap^;
    IFEND;

    IF (p_tape_descriptor^.last_accessed.secured_header_labels <> NIL) THEN
      FREE p_tape_descriptor^.last_accessed.secured_header_labels IN osv$task_shared_heap^;
    IFEND;

    IF (p_tape_descriptor^.last_accessed.unsecured_trailer_labels <> NIL) THEN
      FREE p_tape_descriptor^.last_accessed.unsecured_trailer_labels IN osv$job_pageable_heap^;
    IFEND;

    IF (p_tape_descriptor^.last_accessed.secured_trailer_labels <> NIL) THEN
      FREE p_tape_descriptor^.last_accessed.secured_trailer_labels IN osv$task_shared_heap^;
    IFEND;

    IF p_tape_descriptor^.tape_attachment_information.volume_initialization THEN
      IF p_tape_descriptor^.tape_attachment_information.tape_volume_initialization.blank_label_group <>
            NIL THEN
        FREE p_tape_descriptor^.tape_attachment_information.tape_volume_initialization.blank_label_group IN
              osv$task_private_heap^;
      IFEND;
    IFEND;

  PROCEND bap$free_tape_label_sequences;
?? OLDTITLE ??
?? NEWTITLE := 'PROCEDURE [XDCL, #GATE] bap$store_unsecured_tape_labels', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$store_unsecured_tape_labels
    (    p_label_sequence: ^SEQ ( * );
     VAR p_stored_label_sequence: ^SEQ ( * ));

    VAR
      p_local_label_sequence: ^SEQ ( * );

    IF p_label_sequence <> NIL THEN
      IF p_stored_label_sequence <> NIL THEN
        FREE p_stored_label_sequence IN osv$job_pageable_heap^;
      IFEND;
      ALLOCATE p_local_label_sequence: [[REP #SIZE (p_label_sequence^) OF cell]] IN osv$job_pageable_heap^;
      p_local_label_sequence^ := p_label_sequence^;
      RESET p_local_label_sequence;
      p_stored_label_sequence := p_local_label_sequence;
    IFEND;

  PROCEND bap$store_unsecured_tape_labels;
?? OLDTITLE ??
?? NEWTITLE := 'FUNCTION [XDCL, #GATE] bap$volume_robotically_mounted', EJECT ??

  FUNCTION [XDCL, #GATE] bap$volume_robotically_mounted
    (    sfid: gft$system_file_identifier): boolean;

    bap$volume_robotically_mounted := dmv$tape_job_lun_table_p^.tape_file^ [sfid.file_entry_index].
          robotic_mount_info.volume_robotically_mounted;

  FUNCEND bap$volume_robotically_mounted;
?? OLDTITLE ??
MODEND bam$system_tape_label_fap_ring2;
