?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE: Job Management Job Attribute Interfaces' ??
MODULE qfm$set_job_attributes;

{ PURPOSE:
{   This module contains the ring 1 Job Management attribute manipulation interfaces.  The interfaces are
{   used to give values to the system's default job attributes and a job's ring 1 attributes.

{ DESIGN:
{   The procedure qfp$set_job_attributes is used to alter the ring 1 attributes of a job.  Generally,
{ ring 1 job attributes are those attributes that must be referenced by another job or by monitor.
{
{   The procedure qfp$change_attribute_defaults is used to update the system's default job attribute
{ values.  The modified structure is in mainframe pageable.

?? NEWTITLE := 'Global Declarations Referenced by this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc jmt$attribute_keys
*copyc jmt$default_attribute_changes
*copyc jmt$dispatching_control_info
*copyc jmt$initiated_job_list_entry
*copyc jmt$job_attribute_changes
*copyc jmt$job_control_block
*copyc ost$signature_lock
*copyc ost$status
*copyc ost$wait
*copyc tmt$change_priority_origin
?? POP ??
*copyc jmp$change_dispatching_prior_r1
*copyc jmp$determine_dis_priority
*copyc jmp$get_ijle_p
*copyc jmv$default_job_attributes
*copyc jmv$ijl_p
*copyc jmv$jcb
*copyc jmv$kjl_p
*copyc mmv$aging_algorithm
*copyc osp$clear_signature_lock
*copyc osp$set_signature_lock
*copyc oss$mainframe_pageable
?? TITLE := 'qfp$change_attribute_defaults', EJECT ??
*copy qfh$change_attribute_defaults

  PROCEDURE [XDCL, #GATE] qfp$change_attribute_defaults
    (    job_mode: jmt$job_mode;
         default_attribute_changes_p: ^jmt$default_attribute_changes;
     VAR status: ost$status);

    VAR
      job_qualifier_index: 1 .. jmc$maximum_job_qualifiers,
      option_index: integer,
      osv$change_attr_def_lock: [STATIC, oss$mainframe_pageable] ost$signature_lock := [0];

    status.normal := TRUE;

    IF default_attribute_changes_p <> NIL THEN

      osp$set_signature_lock (osv$change_attr_def_lock, osc$wait, status);

      FOR option_index := 1 TO UPPERBOUND (default_attribute_changes_p^) DO
        CASE default_attribute_changes_p^ [option_index].key OF
        = jmc$cpu_time_limit =
          jmv$default_job_attributes [job_mode].cpu_time_limit :=
                default_attribute_changes_p^ [option_index].cpu_time_limit;

        = jmc$job_abort_disposition =
          jmv$default_job_attributes [job_mode].job_abort_disposition :=
                default_attribute_changes_p^ [option_index].job_abort_disposition;

        = jmc$job_class =
          jmv$default_job_attributes [job_mode].job_class :=
                default_attribute_changes_p^ [option_index].job_class;

        = jmc$job_deferred_by_operator =
          jmv$default_job_attributes [job_mode].job_deferred_by_operator :=
                default_attribute_changes_p^ [option_index].job_deferred_by_operator;

        = jmc$job_destination_usage =
          jmv$default_job_attributes [job_mode].job_destination_usage :=
                default_attribute_changes_p^ [option_index].job_destination_usage;

        = jmc$job_qualifier_list =
          FOR job_qualifier_index := 1 TO jmc$maximum_job_qualifiers DO
            jmv$default_job_attributes [job_mode].job_qualifier_list [job_qualifier_index] :=
                  default_attribute_changes_p^ [option_index].job_qualifier_list^ [job_qualifier_index];
          FOREND;

        = jmc$job_recovery_disposition =
          jmv$default_job_attributes [job_mode].job_recovery_disposition :=
                default_attribute_changes_p^ [option_index].job_recovery_disposition;

        = jmc$login_family =
          jmv$default_job_attributes [job_mode].login_family :=
                default_attribute_changes_p^ [option_index].login_family;

        = jmc$magnetic_tape_limit =
          jmv$default_job_attributes [job_mode].magnetic_tape_limit :=
                default_attribute_changes_p^ [option_index].magnetic_tape_limit;

        = jmc$maximum_working_set =
          jmv$default_job_attributes [job_mode].maximum_working_set :=
                default_attribute_changes_p^ [option_index].maximum_working_set;

        = jmc$null_attribute =
          ;

        = jmc$output_class =
          jmv$default_job_attributes [job_mode].output_class :=
                default_attribute_changes_p^ [option_index].output_class;

        = jmc$output_deferred_by_operator =
          jmv$default_job_attributes [job_mode].output_deferred_by_operator :=
                default_attribute_changes_p^ [option_index].output_deferred_by_operator;

        = jmc$output_destination_usage =
          jmv$default_job_attributes [job_mode].output_destination_usage :=
                default_attribute_changes_p^ [option_index].output_destination_usage;

        = jmc$purge_delay =
          jmv$default_job_attributes [job_mode].purge_delay :=
                default_attribute_changes_p^ [option_index].purge_delay^;

        = jmc$deferred_by_operator =
          jmv$default_job_attributes [job_mode].qfile_deferred_by_operator :=
                default_attribute_changes_p^ [option_index].deferred_by_operator;

        = jmc$site_information =
          jmv$default_job_attributes [job_mode].site_information :=
                default_attribute_changes_p^ [option_index].site_information^;

        = jmc$sru_limit =
          jmv$default_job_attributes [job_mode].sru_limit :=
                default_attribute_changes_p^ [option_index].sru_limit;

        = jmc$station =
          jmv$default_job_attributes [job_mode].station := default_attribute_changes_p^ [option_index].
                station;

        = jmc$vertical_print_density =
          jmv$default_job_attributes [job_mode].vertical_print_density :=
                default_attribute_changes_p^ [option_index].vertical_print_density;

        ELSE
          ;
        CASEND;
      FOREND;

      osp$clear_signature_lock (osv$change_attr_def_lock, status);

    IFEND;
  PROCEND qfp$change_attribute_defaults;
?? TITLE := 'qfp$set_job_attributes', EJECT ??
*copy qfh$set_job_attributes

  PROCEDURE [XDCL, #GATE] qfp$set_job_attributes
    (    attribute_value: jmt$job_attribute_change;
     VAR status: ost$status);

    VAR
      cptime: integer,
      dispatching_control_info: jmt$dispatching_control_info,
      ignore_status_p: ^ost$status,
      ijl_entry_p: ^jmt$initiated_job_list_entry;

    status.normal := TRUE;

    CASE attribute_value.key OF
    = jmc$cyclic_aging_interval =
      jmv$jcb.cyclic_aging_interval := attribute_value.cyclic_aging_interval;
      jmv$jcb.next_cyclic_aging_time := #FREE_RUNNING_CLOCK (0) + jmv$jcb.cyclic_aging_interval;

    = jmc$detached_job_wait_time =
      jmv$jcb.detached_job_wait_time := attribute_value.detached_job_wait_time;

    = jmc$dispatching_priority =
      PUSH ignore_status_p;
      jmp$determine_dis_priority (attribute_value.dispatching_priority,
            dispatching_control_info.dispatching_priority, ignore_status_p^);
      jmp$change_dispatching_prior_r1 (tmc$cpo_user, jmv$jcb.ijl_ordinal, jmv$jcb.system_name,
            dispatching_control_info, status);

    = jmc$job_abort_disposition =
      jmp$get_ijle_p (jmv$kjl_p^ [jmv$jcb.job_id].initiated_job_list_ordinal, ijl_entry_p);
      ijl_entry_p^.queue_file_information.job_abort_disposition := attribute_value.job_abort_disposition;

    = jmc$job_recovery_disposition =
      jmp$get_ijle_p (jmv$kjl_p^ [jmv$jcb.job_id].initiated_job_list_ordinal, ijl_entry_p);
      ijl_entry_p^.queue_file_information.job_recovery_disposition :=
            attribute_value.job_recovery_disposition;

    = jmc$maximum_working_set =
      jmv$jcb.max_working_set_size := attribute_value.maximum_working_set;

    = jmc$minimum_working_set =
      jmv$jcb.min_working_set_size := attribute_value.minimum_working_set;

    = jmc$page_aging_interval =
      jmv$jcb.page_aging_interval := attribute_value.page_aging_interval;
      jmp$get_ijle_p (jmv$kjl_p^ [jmv$jcb.job_id].initiated_job_list_ordinal, ijl_entry_p);
      IF mmv$aging_algorithm >= 4 THEN
        cptime := ijl_entry_p^.statistics.cp_time.time_spent_in_job_mode;
      ELSE
        cptime := ijl_entry_p^.statistics.cp_time.time_spent_in_job_mode +
              ijl_entry_p^.statistics.cp_time.time_spent_in_mtr_mode;
      IFEND;
      jmv$jcb.cptime_next_age_working_set := cptime + jmv$jcb.page_aging_interval;

    ELSE
      ;
    CASEND;
  PROCEND qfp$set_job_attributes;
?? TITLE := 'qfp$change_job_rcv_disposition', EJECT ??

  PROCEDURE [XDCL, #GATE] qfp$change_job_rcv_disposition
    (    new_job_recovery_disposition: jmt$job_recovery_disposition;
     VAR old_job_recovery_disposition: jmt$job_recovery_disposition);

    old_job_recovery_disposition := jmv$jcb.ijle_p^.queue_file_information.job_recovery_disposition;
    jmv$jcb.ijle_p^.queue_file_information.job_recovery_disposition := new_job_recovery_disposition;

  PROCEND qfp$change_job_rcv_disposition;
MODEND qfm$set_job_attributes;
