?? NEWTITLE := 'NOSVE Device Management' ??
MODULE dmm$mtr_front_ends;
?? RIGHT := 110 ??

{ PURPOSE:
{   This module prepares the request block parameters for the DM monitor requests.
{
{ DESIGN:
{   The request block parameters are prepared using the supplied system file id and inserted into the
{   request block.
{
?? NEWTITLE := 'Global Declarations Referenced By This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc mtc$job_fixed_segment
*copyc dmt$allocation_log
*copyc dmt$error_condition_codes
*copyc dmt$file_medium_descriptor
*copyc dmt$file_table_lock
*copyc dmt$monitor_request_blocks
*copyc gft$file_descriptor_entry
*copyc ost$cpu_state_table
*copyc ost$heap
*copyc syt$monitor_request_code
*copyc syt$monitor_status
?? POP ??
*copyc dmp$allocate_file_space
*copyc dmp$deallocate_file_space
*copyc dmp$get_fmd_by_index
*copyc dmp$mtr_log
*copyc dmp$mtr_reallocate_file_space
*copyc gfp$mtr_get_locked_fde_p
*copyc mtp$error_stop
*copyc mtp$set_status_abnormal
*copyc mmv$last_segment_accessed
?? OLDTITLE ??
?? NEWTITLE := '  dmp$mtr_allocate_front_end', EJECT ??
*copy dmh$mtr_allocate_front_end

  PROCEDURE [XDCL] dmp$mtr_allocate_front_end
    (VAR allocate_request_block: dmt$monitor_rb_allocate_space;
         p_cst: ^ost$cpu_state_table);

    VAR
      allocate_byte_address: amt$file_byte_address,
      allocation_units_obtained: amt$file_byte_address,
      file_space_limit: sft$file_space_limit_kind,
      overflow_indicator: boolean,
      p_dfd: ^dmt$disk_file_descriptor,
      p_fde: gft$locked_file_desc_entry_p,
      requested_allocation: amt$file_byte_address,
      status: dmt$file_allocation_status,
      system_file_id: gft$system_file_identifier;

    IF allocate_request_block.update_fat_pointer THEN
      p_dfd := allocate_request_block.p_dfd;
      IF (#SEGMENT (p_dfd) <> osc$segnum_mainframe_wired) THEN
        p_dfd := #ADDRESS (1, p_cst^.ijle_p^.ajl_ordinal + mtc$job_fixed_segment, #OFFSET (p_dfd));
      IFEND;
      p_dfd^.file_allocation_table := allocate_request_block.p_fat;
      p_dfd^.fat_upper_bound := allocate_request_block.fat_upper_bound;
    ELSE
      mmv$last_segment_accessed := 0; {for file limits}
      system_file_id := allocate_request_block.system_file_id;

      gfp$mtr_get_locked_fde_p (system_file_id, p_cst^.ijle_p, p_fde);

      allocate_byte_address := allocate_request_block.allocate_byte_address;
      requested_allocation := allocate_request_block.requested_allocation;
      file_space_limit := allocate_request_block.file_space_limit;

      dmp$allocate_file_space (p_fde, allocate_byte_address, requested_allocation, file_space_limit,
            allocation_units_obtained, overflow_indicator, status);

      allocate_request_block.allocation_units_obtained := allocation_units_obtained;
      allocate_request_block.overflow_indicator := overflow_indicator;
      allocate_request_block.status := status;
    IFEND;

  PROCEND dmp$mtr_allocate_front_end;
?? OLDTITLE ??
?? NEWTITLE := '  dmp$mtr_deallocate_front_end', EJECT ??
*copy dmh$mtr_deallocate_front_end

  PROCEDURE [XDCL] dmp$mtr_deallocate_front_end
    (VAR deallocate_request_block: dmt$monitor_rb_deallocate_space;
         p_cst: ^ost$cpu_state_table);

    VAR
      able: boolean,
      al_entry: dmt$al_entry,
      p_fde: gft$locked_file_desc_entry_p,
      system_file_id: gft$system_file_identifier;

    deallocate_request_block.status.normal := TRUE;
    system_file_id := deallocate_request_block.system_file_id;

    gfp$mtr_get_locked_fde_p (system_file_id, p_cst^.ijle_p, p_fde);

    CASE deallocate_request_block.monitor_request OF
    = dmc$deallocate_space =
      dmp$deallocate_file_space (p_fde, deallocate_request_block.release_byte_address,
            deallocate_request_block.bytes_to_release);

    = dmc$trim_file_space =
      al_entry.kind := dmc$al_trim_file;
      al_entry.avt_index := deallocate_request_block.avt_index;
      al_entry.trim_file_block.global_file_name := deallocate_request_block.global_file_name;
      al_entry.trim_file_block.dfl_index := deallocate_request_block.dfl_index;
      al_entry.trim_file_block.dau_address := deallocate_request_block.dau_address;
      al_entry.trim_file_block.dau_of_fragment := deallocate_request_block.dau_of_fragment;

      dmp$mtr_log (al_entry, able);
      IF NOT able THEN
        mtp$set_status_abnormal (dmc$device_manager_ident, dme$transient_error,
              deallocate_request_block.status);
      IFEND;

    ELSE
      mtp$set_status_abnormal (dmc$device_manager_ident, dme$invalid_monitor_call,
            deallocate_request_block.status);
    CASEND;

  PROCEND dmp$mtr_deallocate_front_end;
?? OLDTITLE ??
?? NEWTITLE := '  dmp$mtr_reallocate_front_end', EJECT ??

  PROCEDURE [XDCL] dmp$mtr_reallocate_front_end
    (VAR reallocate_request_block: dmt$monitor_rb_reallocate_space;
         p_cst: ^ost$cpu_state_table);

    VAR
      p_fde: gft$locked_file_desc_entry_p,
      system_file_id: gft$system_file_identifier;

    reallocate_request_block.status.normal := TRUE;
    system_file_id := reallocate_request_block.system_file_id;

{locate file descriptor
    gfp$mtr_get_locked_fde_p (system_file_id, p_cst^.ijle_p, p_fde);

    reallocate_request_block.p_fde := p_fde;
    reallocate_request_block.global_file_name := p_fde^.global_file_name;

    dmp$mtr_reallocate_file_space (reallocate_request_block);

  PROCEND dmp$mtr_reallocate_front_end;
?? OLDTITLE ??
MODEND dmm$mtr_front_ends;
