?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Job Management initialize job tables' ??
MODULE jmm$initialize_job_tables;

{ PURPOSE:
{   This module contains the code to initialize the tables
{   that are local to ring 1 of the job structure.
{
{ DESIGN:
{   The procedures in this module execute in ring one and are
{   callable from ring 3.  The primary data object that is modified is
{   the job control block.

?? OLDTITLE ??
?? NEWTITLE := 'Global Declarations Referenced by this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc jmt$job_attributes
*copyc jmt$job_system_label
*copyc ost$status
*copyc pmt$sense_switches
?? POP ??
*copyc pmp$get_executing_task_gtid
*copyc pmp$get_pseudo_mainframe_id

*copyc jmv$ijl_p
*copyc jmv$jcb
*copyc jmv$job_class_table_p
*copyc jmv$kjl_p
*copyc jmv$kjlx_p
*copyc jmv$known_job_list
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] jmp$initialize_jcb', EJECT ??

  PROCEDURE [XDCL, #GATE] jmp$initialize_jcb;

    VAR
      global_task_id: ost$global_task_id,
      kjl_index: jmt$kjl_index;

    kjl_index := jmv$jcb.job_id;

{ Initialize fields in the Job Control Block (JCB).

    pmp$get_executing_task_gtid (global_task_id);
    jmv$jcb.system_name := jmv$kjl_p^ [kjl_index].system_job_name;
    jmv$jcb.jobname := jmv$kjl_p^ [kjl_index].user_job_name;
    jmv$jcb.user_id := jmv$kjlx_p^ [kjl_index].login_user_identification;
    jmv$jcb.job_monitor_id := global_task_id;
    jmv$jcb.ijle_p^.job_mode := jmv$kjlx_p^ [kjl_index].job_mode;
    IF jmv$kjl_p^ [kjl_index].server_index = jmc$kjl_server_undefined THEN
      pmp$get_pseudo_mainframe_id (jmv$jcb.server_mainframe_id);
    ELSE
      jmv$jcb.server_mainframe_id := jmv$known_job_list.server_data.
            state_data [jmv$kjl_p^ [kjl_index].server_index].mainframe_id;
    IFEND;
    jmv$jcb.sense_switches := $pmt$sense_switches [];
    jmv$jcb.perm_file_job_warning_limit := sfc$unlimited;
    jmv$jcb.perm_file_job_warning_checking := FALSE;
    jmv$jcb.perm_file_job_maximum_limit := sfc$unlimited;
    jmv$jcb.temp_file_job_warning_limit := sfc$unlimited;
    jmv$jcb.temp_file_job_warning_checking := FALSE;
    jmv$jcb.temp_file_job_maximum_limit := sfc$unlimited;

    jmv$jcb.account_project_specified := FALSE;
  PROCEND jmp$initialize_jcb;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] jmp$initialize_job_local_tables', EJECT ??

  PROCEDURE [XDCL, #GATE] jmp$initialize_job_local_tables
    (    system_label_p: ^jmt$job_system_label;
     VAR status: ost$status);

    VAR
      job_class: jmt$job_class,
      maximum_working_set: jmt$working_set_size;

    status.normal := TRUE;

{ A NIL system label pointer implies the system job.

    IF system_label_p = NIL THEN
      jmv$jcb.ijle_p^.queue_file_information.job_abort_disposition := jmc$terminate_on_abort;
      jmv$jcb.ijle_p^.queue_file_information.job_recovery_disposition := jmc$terminate_on_recovery;
      jmv$jcb.ijle_p^.queue_file_information.input_file_location := jmc$ifl_no_input_file_exists;
    ELSE

{ Set interactive jobs to unrecoverable.  They are set to the requested JAD and JRD
{ in the procedure qfp$set_interactive_jrd_jad.

      IF system_label_p^.job_mode <> jmc$batch THEN
        jmv$jcb.ijle_p^.queue_file_information.job_abort_disposition := jmc$terminate_on_abort;
        jmv$jcb.ijle_p^.queue_file_information.job_recovery_disposition := jmc$terminate_on_recovery;
      ELSE
        jmv$jcb.ijle_p^.queue_file_information.job_abort_disposition := system_label_p^.job_abort_disposition;
        jmv$jcb.ijle_p^.queue_file_information.job_recovery_disposition :=
              system_label_p^.job_recovery_disposition;
      IFEND;
      jmv$jcb.ijle_p^.queue_file_information.input_file_location :=
            jmv$kjlx_p^ [jmv$jcb.job_id].input_file_location;

{ Assign the maximum working set to the job that was requested at job submission.
{ Restrict the value assigned to the maximum working set range defined for the job class.

      job_class := jmv$kjl_p^ [jmv$jcb.job_id].job_class;
      maximum_working_set := system_label_p^.limit_information.maximum_working_set_assigned;
      IF maximum_working_set < jmv$job_class_table_p^ [job_class].maximum_working_set.minimum THEN
        maximum_working_set := jmv$job_class_table_p^ [job_class].maximum_working_set.minimum;
      ELSEIF maximum_working_set > jmv$job_class_table_p^ [job_class].maximum_working_set.maximum THEN
        maximum_working_set := jmv$job_class_table_p^ [job_class].maximum_working_set.maximum;
      IFEND;
      jmv$jcb.max_working_set_size := maximum_working_set;
    IFEND;
  PROCEND jmp$initialize_job_local_tables;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] jmp$manage_sense_switches', EJECT ??

  PROCEDURE [XDCL, #GATE] jmp$manage_sense_switches
    (    ON: pmt$sense_switches;
         OFF: pmt$sense_switches);

    jmv$jcb.sense_switches := jmv$jcb.sense_switches + ON;
    jmv$jcb.sense_switches := jmv$jcb.sense_switches - OFF;
  PROCEND jmp$manage_sense_switches;
?? OLDTITLE ??
MODEND jmm$initialize_job_tables;
