?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Job Management : Scheduler Tables Initialization' ??
MODULE jmm$job_sched_table_init;

{ PURPOSE:
{   This module initializes the job scheduler tables.
{ DESIGN:
{   The scheduler tables are initialized during system deadstart before the
{   job scheduler task is initiated.  Initialization is performed for the
{   job scheduler, job category data, job class, service class, output class,
{   and application tables.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc jmc$class_names
*copyc jmc$sched_profile_deadstart_id
*copyc jmt$application_table
*copyc jmt$dispatching_control
*copyc jmt$dispatching_control_index
*copyc jmt$job_category_data
*copyc jmt$job_class
*copyc jmt$job_class_table
*copyc jmt$output_class_table
*copyc jmt$profile_index_to_job_class
*copyc jmt$scheduler_tables_access
*copyc jmt$scheduling_utility_usage
*copyc ost$status
?? POP ??

*copyc osp$generate_unique_binary_name
*copyc osp$initialize_sig_lock
*copyc pmp$convert_mainframe_to_binary
*copyc pmp$cycle
*copyc pmp$zero_out_table
*copyc jmv$jcb
*copyc jmv$job_scheduler_table
*copyc jmv$last_service_calc_time
*copyc jmv$max_class_working_set
*copyc jmv$max_service_class_in_use
*copyc jmv$service_classes
*copyc mmv$tick_time
*copyc osv$mainframe_pageable_heap
*copyc osv$mainframe_wired_heap
*copyc pmv$mainframe_id
*copyc pmv$quantum
*copyc tmv$null_global_task_id
?? TITLE := 'Global Declarations Declared by This Module', EJECT ??

  VAR
    jmv$application_table_p: [XDCL, #GATE, oss$mainframe_pageable] ^jmt$application_table,
    jmv$job_category_data: [XDCL, #GATE, oss$mainframe_pageable] jmt$job_category_data,
    jmv$highest_rank_job_class: [XDCL, #GATE, oss$mainframe_pageable] jmt$job_class,
    jmv$job_class_table_p: [XDCL, #GATE, oss$mainframe_pageable] ^jmt$job_class_table,
    jmv$maximum_job_class_in_use: [XDCL, #GATE, oss$mainframe_pageable] jmt$job_class,
    jmv$maximum_job_classes: [XDCL, #GATE, oss$mainframe_pageable] 0 .. 0ffffffff(16) := 15,
    jmv$maximum_output_classes: [XDCL, #GATE, oss$mainframe_pageable] 0 .. 0ffffffff(16) := 1,
    jmv$maximum_output_class_in_use: [XDCL, #GATE, oss$mainframe_pageable] jmt$output_class_index,
    jmv$maximum_profile_index: [XDCL, #GATE, oss$mainframe_pageable] jmt$job_class,
    jmv$maximum_service_classes: [XDCL, #GATE, oss$mainframe_pageable] 0 .. 0ffffffff(16) := 15,
    jmv$output_class_table_p: [XDCL, #GATE, oss$mainframe_pageable] ^jmt$output_class_table,
    jmv$profile_index_to_job_class: [XDCL, #GATE, oss$mainframe_pageable] jmt$profile_index_to_job_class,
    jmv$scheduler_tables_access: [XDCL, #GATE, oss$mainframe_pageable] jmt$scheduler_tables_access,
    jmv$scheduling_utility_usage: [XDCL, #GATE, oss$mainframe_pageable] jmt$scheduling_utility_usage;

?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE, OSS$MAINFRAME_PAGEABLE] jmv$default_application_attr', EJECT ??

  VAR
    jmv$default_application_attr: [XDCL, #GATE, oss$mainframe_pageable] jmt$application_attributes := [

?? FMT (FORMAT = OFF) ??

{ Definition group attributes.

{     defined                        #} FALSE,
{     profile_identification         #} jmc$sched_profile_deadstart_id,
{     name                           #} osc$null_name,
{     enable_application_scheduling  #} TRUE,

{ Control group attributes.

{     cyclic_aging_interval          #} jmc$unspecified_aging_interval,
{     maximum_working_set            #} jmc$unspecified_work_set_size,
{     minimum_working_set            #} jmc$unspecified_work_set_size,
{     page_aging_interval            #} jmc$unspecified_aging_interval,
{     service_class_index            #} jmc$unspecified_service_class];

?? FMT (FORMAT = ON) ??
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE, OSS$MAINFRAME_PAGEABLE] jmv$default_job_class_attr', EJECT ??

  VAR
    jmv$default_job_class_attr: [XDCL, #GATE, oss$mainframe_pageable] jmt$job_class_attributes := [

?? FMT (FORMAT = OFF) ??

{ Definition group attributes.

{    defined                        #} FALSE,
{    index                          #} jmc$null_job_class,
{    profile_index                  #} 0,
{    profile_identification         #} jmc$sched_profile_deadstart_id,
{    name                           #} jmc$null_class_name,
{    abbreviation                   #} jmc$null_class_name,
{    prolog_p                       #} NIL,
{    epilog_p                       #} NIL,
{    enable_class_initiation        #} TRUE,
{    immediate_initiation_candidate #} FALSE,
{    default_output_class           #} jmc$normal_class_name,
{    initial_service_class_index    #} jmc$null_service_class,
{    initial_working_set            #} 65,

{ Control attributes.

{    cyclic_aging_interval          #} [50000, 10000, 1000000000],
{    defer_on_submit                #} FALSE,
{    initiation_level               #} [20, 0],
{    maximum_working_set            #} [1000, 20, 1000],
{    minimum_working_set            #} [20, 20, 1000],
{    page_aging_interval            #} [0, 10000, 1000000000],

{ Limit attributes.

{    cpu_time_limit                 #} jmc$unlimited_cpu_time_limit,
{    detached_job_wait_time         #} [3600, 0, 18000],
{    magnetic_tape_limit            #} jmc$unlimited_mag_tape_limit,
{    sru_limit                      #} jmc$unlimited_sru_limit,

{ Membership attributes.

{    automatic_class_selection      #} FALSE,
{    excluded_categories            #} $jmt$job_category_set [],
{    next_rank_class                #} jmc$null_job_class,
{    required_categories            #} $jmt$job_category_set [],

{ Priority group attributes.

{    initiation_age_interval        #} 1000000,
{    job_leveling_priority_bias     #} 0,
{    multiple_job_bias              #} 0,
{    selection_priority             #} [100, 10000, 1, 0]];

?? FMT (FORMAT = ON) ??
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE, OSS$MAINFRAME_PAGEABLE] jmv$default_output_class_attr', EJECT ??

  VAR
    jmv$default_output_class_attr: [XDCL, #GATE, oss$mainframe_pageable] jmt$output_class_attributes := [

?? FMT (FORMAT = OFF) ??

{ Definition group attributes.

{    defined                        #} FALSE,
{    index                          #} jmc$null_output_class,
{    profile_identification         #} jmc$sched_profile_deadstart_id,
{    name                           #} jmc$null_class_name,
{    abbreviation                   #} jmc$null_class_name,
{    enable_class_scheduling        #} TRUE,

{ Priority group attributes.

{    delivery_priority              #} [100, 2000, 1],
{    output_age_interval            #} 1000000];

?? FMT (FORMAT = ON) ??
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE, OSS$MAINFRAME_PAGEABLE] jmv$default_service_class_attr', EJECT ??

  VAR
    jmv$default_service_class_attr: [XDCL, #GATE, oss$mainframe_pageable] jmt$service_class_attributes := [

?? FMT (FORMAT = OFF) ??

{ Definition group attributes.

{    defined                        #} FALSE,
{    index                          #} jmc$null_service_class,
{    profile_identification         #} jmc$sched_profile_deadstart_id,
{    name                           #} jmc$null_class_name,
{    abbreviation                   #} jmc$null_class_name,

{ Control group attributes.

{    aio_limit                      #} 60000,
{    attempt_preemption             #} TRUE,
{    swap_jobs_in_longwait          #} TRUE,
{    class_service_threshold        #} jmc$unlimited_service_accum,
{    guaranteed_service_quantum     #} 100,
{    long_wait_think_time           #} 0,
{    maximum_active_jobs            #} 20,
{    next_service_class_index       #} jmc$null_service_class,
{    service_factors                #} [1, 0, 0, 0],

{ Priority group attributes.

{    dispatching_control [1]        #} [[TRUE, jmc$priority_p4, jmc$dc_maximum_service_limit, [0, 0]],
{    dispatching_control [2]        #} [FALSE, 0, 0, [0, 0]],
{    dispatching_control [3]        #} [FALSE, 0, 0, [0, 0]],
{    dispatching_control [4]        #} [FALSE, 0, 0, [0, 0]],
{    dispatching_control [5]        #} [FALSE, 0, 0, [0, 0]]],
{    scheduling_priority            #} [100, 1000, 1, 500],
{    swap_age_interval              #} 1000000];

?? FMT (FORMAT = ON) ??
?? TITLE := 'initialize_application_table', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the application table for
{   application scheduling.

  PROCEDURE initialize_application_table;

{ Initialize                                           the application table to contain no applications.

    jmv$application_table_p := NIL;

  PROCEND initialize_application_table;
?? TITLE := 'initialize_default_job_attr', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the default attributes for
{   a job class which are used when creating a new job class.
{ NOTES:
{   Creation of a new job class is performed by the ADMINISTER_SCHEDULING
{   utility.  These default attributes are accessed by MANAGE_ACTIVE_SCHEDULING
{   utility when a scheduling profile is installed.

  PROCEDURE initialize_default_job_attr;

{ Initialize the Definition attributes.

{ Initialize the Control attributes.

    jmv$default_job_class_attr.page_aging_interval.default := mmv$tick_time;

{ Initialize the Limit attributes.

{ Initialize the Membership group attributes.

{ Initialize the Priority group attributes.

  PROCEND initialize_default_job_attr;
?? TITLE := 'initialize_default_service_attr', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the default attributes for
{   a service class which are used when creating a new service class.
{ NOTES:
{   Creation of a new service class is performed by the ADMINISTER_SCHEDULING
{   utility.  These default attributes are accessed by MANAGE_ACTIVE_SCHEDULING
{   utility when a scheduling profile is installed.

  PROCEDURE initialize_default_service_attr;

{ Initialize the Definition group attributes.

{ Initialize the Control group attributes.

{ Initialize the Priority group attributes.

    jmv$default_service_class_attr.dispatching_control [jmc$min_dispatching_control].set_defined := TRUE;
    jmv$default_service_class_attr.dispatching_control [jmc$min_dispatching_control].dispatching_priority :=
          jmc$priority_p4;
    jmv$default_service_class_attr.dispatching_control [jmc$min_dispatching_control].service_limit :=
          jmc$dc_maximum_service_limit;
    jmv$default_service_class_attr.dispatching_control [jmc$min_dispatching_control].dispatching_timeslice.
          minor := pmv$quantum;
    jmv$default_service_class_attr.dispatching_control [jmc$min_dispatching_control].dispatching_timeslice.
          major := pmv$quantum;

  PROCEND initialize_default_service_attr;
?? TITLE := 'initialize_job_category_data', EJECT ??

{ PURPOSE:
{   The purpose of this request in to initialize the job category data.

  PROCEDURE initialize_job_category_data;

{ Initialize the job category data to contain no categories.

    VAR
      entry: jmt$job_category_item_kind;

    jmv$job_category_data.item_list := NIL;
    FOR entry := LOWERVALUE (jmt$job_category_item_kind) TO UPPERVALUE (jmt$job_category_item_kind) DO
      jmv$job_category_data.initial_set_values [entry] := $jmt$job_category_set [];
    FOREND;
    jmv$job_category_data.category_names := NIL;

  PROCEND initialize_job_category_data;
?? TITLE := 'initialize_job_class_table', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the job class table.
{ DESIGN:
{   The job class table is allocated and the job classes, SYSTEM, MAINTENANCE,
{   and UNASSIGNED are defined.

  PROCEDURE initialize_job_class_table;

    VAR
      job_class: ^jmt$job_class_attributes;

{ Allocate the maximum sized job class table but only initialize part of it.

    ALLOCATE jmv$job_class_table_p: [1 .. jmc$maximum_job_classes] IN osv$mainframe_pageable_heap^;

    pmp$zero_out_table (^jmv$profile_index_to_job_class, #SIZE (jmv$profile_index_to_job_class));

{ Initialize the SYSTEM job class.

    job_class := ^jmv$job_class_table_p^ [jmc$system_job_class];
    job_class^ := jmv$default_job_class_attr;

{ Initialize the Definition group attributes.

    job_class^.defined := TRUE;
    job_class^.index := jmc$system_job_class;
    job_class^.profile_index := 1;
    job_class^.profile_identification := jmc$system_class_name;
    job_class^.name := jmc$system_class_name;
    job_class^.abbreviation := 'S';
    job_class^.initial_service_class_index := jmc$system_service_class;
    job_class^.initial_working_set := 80;

{ Initialize the Control group attributes.

    job_class^.cyclic_aging_interval.default := 1000000000;
    job_class^.initiation_level.preferred := 20;
    job_class^.initiation_level.maximum_increment := 0;

{ Initialize the Limit group attributes.

    job_class^.detached_job_wait_time.default := 18000;
    job_class^.detached_job_wait_time.minimum := 18000;

{ Initialize the Membership attributes.

{ Initialize the Priority group attributes.

    job_class^.selection_priority.initial := 19000;
    job_class^.selection_priority.maximum := 22000;
    job_class^.selection_priority.increment := 100;
    job_class^.selection_priority.threshold := 19000;

{ Initialize the MAINTENANCE job class.

    job_class := ^jmv$job_class_table_p^ [jmc$maintenance_job_class];
    job_class^ := jmv$default_job_class_attr;

{ Initialize the Definition group attributes.

    job_class^.defined := TRUE;
    job_class^.index := jmc$maintenance_job_class;
    job_class^.profile_index := 2;
    job_class^.profile_identification := jmc$maintenance_class_name;
    job_class^.name := jmc$maintenance_class_name;
    job_class^.abbreviation := 'M';
    job_class^.immediate_initiation_candidate := TRUE;
    job_class^.initial_service_class_index := jmc$maintenance_service_class;

{ Initialize the Control group attributes.

    job_class^.cyclic_aging_interval.default := 1000000000;
    job_class^.initiation_level.preferred := 100;
    job_class^.initiation_level.maximum_increment := 0;

{ Initialize the Limit group attributes.

    job_class^.detached_job_wait_time.default := 18000;
    job_class^.detached_job_wait_time.minimum := 18000;
    job_class^.detached_job_wait_time.maximum := 18000;

{ Initialize the Membership group attributes.

{ Initialize the Priority group attributes.

    job_class^.selection_priority.initial := 14000;
    job_class^.selection_priority.maximum := 17000;
    job_class^.selection_priority.increment := 1000;
    job_class^.selection_priority.threshold := 14000;


{ Initialize the UNASSIGNED job class.

    job_class := ^jmv$job_class_table_p^ [jmc$unassigned_job_class];
    job_class^ := jmv$default_job_class_attr;

{ Initialize the Definition group attributes.

    job_class^.defined := TRUE;
    job_class^.index := jmc$unassigned_job_class;
    job_class^.profile_index := 3;
    job_class^.profile_identification := jmc$unassigned_class_name;
    job_class^.name := jmc$unassigned_class_name;
    job_class^.abbreviation := 'U';
    job_class^.enable_class_initiation := FALSE;
    job_class^.initial_service_class_index := jmc$unassigned_service_class;

{ Initialize the Control group attributes.

    job_class^.cyclic_aging_interval.default := 1000000000;
    job_class^.initiation_level.preferred := 20;
    job_class^.initiation_level.maximum_increment := 0;

{ Initialize the Limit group attributes.

    job_class^.detached_job_wait_time.default := 18000;
    job_class^.detached_job_wait_time.minimum := 18000;
    job_class^.detached_job_wait_time.maximum := 18000;

{ Initialize the Membership group attributes.

{ Initialize the Priority group attributes.

    job_class^.selection_priority.initial := 14000;
    job_class^.selection_priority.maximum := 17000;
    job_class^.selection_priority.increment := 1000;
    job_class^.selection_priority.threshold := 14000;

{ The default values of the system job class attributes are NOT to be moved into the JCB of the System Job.
{ The JCB of the System Job was initialized in sym$deadstart_initialization and is NOT to be affected by
{ the attributes of the "system" job class.  Now initialize the maximum class working set to zero.  It
{ is not to include the System Job MAXWS and the System Job is all that is executing at deadstart.

    jmv$max_class_working_set := 0;

{ Initialize the highest rank job class for automatic class selection.

    jmv$highest_rank_job_class := jmc$null_job_class;

{ Set the highest job class index currently used.

    jmv$maximum_job_class_in_use := jmc$minimum_job_classes;

{ Set the job leveling translation table.

    jmv$profile_index_to_job_class [1] := jmc$system_job_class;
    jmv$profile_index_to_job_class [2] := jmc$maintenance_job_class;
    jmv$profile_index_to_job_class [3] := jmc$unassigned_job_class;
    jmv$maximum_profile_index := 3;

  PROCEND initialize_job_class_table;
?? TITLE := 'initialize_job_scheduler_table', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the job scheduler table.
{ NOTES:
{   The job scheduler table is preset when it is defined in monitor.
{   Those attributes which cannot be preset are initialized here.

  PROCEDURE initialize_job_scheduler_table
    (VAR status: ost$status);

    VAR
      binary_id: pmt$binary_mainframe_id;

{ Initialize the Definition group attributes.

    jmv$job_scheduler_table.cpu_quantum_time := pmv$quantum;

{ Initialize the Membership group attributes for one mainframe with no
{ job categories.

    ALLOCATE jmv$job_scheduler_table.validation_categories_p: [1 .. 1] IN osv$mainframe_pageable_heap^;
    jmv$job_scheduler_table.validation_categories_p^ [1].mainframe_id := pmv$mainframe_id;
    jmv$job_scheduler_table.validation_categories_p^ [1].excluded := $jmt$job_category_set [];
    jmv$job_scheduler_table.validation_categories_p^ [1].required := $jmt$job_category_set [];
    pmp$convert_mainframe_to_binary (pmv$mainframe_id, binary_id, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    jmv$job_scheduler_table.validation_categories_p^ [1].binary_mainframe_id := binary_id;

  PROCEND initialize_job_scheduler_table;
?? TITLE := 'initialize_output_class_table', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the output class table.
{ DESIGN:
{   The output class table is allocated and the output class NORMAL is
{   defined.

  PROCEDURE initialize_output_class_table;

    VAR
      output_class: jmt$output_class_index;

    ALLOCATE jmv$output_class_table_p: [1 .. jmv$maximum_output_classes] IN osv$mainframe_pageable_heap^;
    FOR output_class := jmc$system_output_class TO jmv$maximum_output_classes DO
      jmv$output_class_table_p^ [output_class] := jmv$default_output_class_attr;
    FOREND;


{ Initialize the NORMAL output class.

{ Initialize the Definition group attributes.

    jmv$output_class_table_p^ [jmc$system_output_class].defined := TRUE;
    jmv$output_class_table_p^ [jmc$system_output_class].index := jmc$system_output_class;
    jmv$output_class_table_p^ [jmc$system_output_class].profile_identification := jmc$unassigned_class_name;
    jmv$output_class_table_p^ [jmc$system_output_class].name := jmc$normal_class_name;
    jmv$output_class_table_p^ [jmc$system_output_class].abbreviation := 'N';
    jmv$output_class_table_p^ [jmc$system_output_class].enable_class_scheduling := TRUE;

{ Initialize the Priority group attributes.

    jmv$output_class_table_p^ [jmc$system_output_class].delivery_priority.initial := 100;
    jmv$output_class_table_p^ [jmc$system_output_class].delivery_priority.maximum := 2000;
    jmv$output_class_table_p^ [jmc$system_output_class].delivery_priority.increment := 1;
    jmv$output_class_table_p^ [jmc$system_output_class].output_age_interval := 1000000;

{ Set the highest output class index currently used.

    jmv$maximum_output_class_in_use := jmc$minimum_output_classes;

  PROCEND initialize_output_class_table;
?? TITLE := 'initialize_sched_table_locks', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the variables which
{   control access to the scheduler tables and use of the scheduling
{   utilities.

  PROCEDURE initialize_sched_tables_locks
    (VAR status: ost$status);

{ Initialize the variable for scheduler tables access.

    osp$initialize_sig_lock (jmv$scheduler_tables_access.lock);
    jmv$scheduler_tables_access.count := 0;

{ Initialize the variable for scheduling utility usage.

    osp$initialize_sig_lock (jmv$scheduling_utility_usage.lock);
    jmv$scheduling_utility_usage.active := FALSE;
    jmv$scheduling_utility_usage.global_task_id := tmv$null_global_task_id;
    osp$generate_unique_binary_name (jmv$scheduling_utility_usage.access_id, status);

  PROCEND initialize_sched_tables_locks;
?? TITLE := 'initialize_service_class_table', EJECT ??

{ PURPOSE:
{   The purpose of this request is to initialize the service class table.
{ DESIGN:
{   The service class table is allocated and the service classes, SYSTEM,
{   MAINTENANCE, and UNASSIGNED are defined.

  PROCEDURE initialize_service_class_table
    (VAR status: ost$status);

    VAR
      service_class: jmt$service_class_index,
      service_class_p: ^jmt$service_class_attributes;

{ Initialize the SYSTEM service class.

    IF jmv$service_classes [jmc$system_service_class] = NIL THEN
      ALLOCATE jmv$service_classes [jmc$system_service_class] IN osv$mainframe_wired_heap^;
      pmp$zero_out_table (jmv$service_classes [jmc$system_service_class],
            #SIZE (jmv$service_classes [jmc$system_service_class]^));
    IFEND;
    service_class_p := ^jmv$service_classes [jmc$system_service_class]^.attributes;
    service_class_p^ := jmv$default_service_class_attr;

{ Initialize the Definition group attributes.

    service_class_p^.defined := TRUE;
    service_class_p^.index := jmc$system_service_class;
    service_class_p^.profile_identification := jmc$system_class_name;
    service_class_p^.name := jmc$system_class_name;
    service_class_p^.abbreviation := 'S';

{ Initialize the Control group attributes.

    service_class_p^.class_service_threshold := 10000000;
    service_class_p^.guaranteed_service_quantum := 2000;
    service_class_p^.maximum_active_jobs := 20;
    service_class_p^.next_service_class_index := jmc$system_service_class;
    service_class_p^.service_factors [jmc$sf_cpu] := 1;
    service_class_p^.service_factors [jmc$sf_memory] := 1;
    service_class_p^.service_factors [jmc$sf_residence] := 1;
    service_class_p^.service_factors [jmc$sf_io] := 1;

{ Initialize the Priority attributes.

    service_class_p^.dispatching_control [jmc$min_dispatching_control].dispatching_priority :=
          jmc$priority_p6;

    service_class_p^.scheduling_priority.minimum := 19000;
    service_class_p^.scheduling_priority.maximum := 22000;
    service_class_p^.scheduling_priority.swap_age_increment := 1000;
    service_class_p^.scheduling_priority.ready_task_increment := 0;
    service_class_p^.swap_age_interval := 1000000;


{ Initialize the MAINTENANCE service class.

    IF jmv$service_classes [jmc$maintenance_service_class] = NIL THEN
      ALLOCATE jmv$service_classes [jmc$maintenance_service_class] IN osv$mainframe_wired_heap^;
      pmp$zero_out_table (jmv$service_classes [jmc$maintenance_service_class],
            #SIZE (jmv$service_classes [jmc$maintenance_service_class]^));
    IFEND;
    service_class_p := ^jmv$service_classes [jmc$maintenance_service_class]^.attributes;
    service_class_p^ := jmv$default_service_class_attr;

{ Initialize the Definition group attributes.

    service_class_p^.defined := TRUE;
    service_class_p^.index := jmc$maintenance_service_class;
    service_class_p^.profile_identification := jmc$maintenance_class_name;
    service_class_p^.name := jmc$maintenance_class_name;
    service_class_p^.abbreviation := 'M';

{ Initialize the Control group attributes.

    service_class_p^.class_service_threshold := 10000000;
    service_class_p^.guaranteed_service_quantum := 9000;
    service_class_p^.maximum_active_jobs := 100;
    service_class_p^.next_service_class_index := jmc$maintenance_service_class;
    service_class_p^.service_factors [jmc$sf_cpu] := 1;
    service_class_p^.service_factors [jmc$sf_memory] := 1;
    service_class_p^.service_factors [jmc$sf_residence] := 1;
    service_class_p^.service_factors [jmc$sf_io] := 1;

{ Initialize the Prioirty group attributes.

    service_class_p^.dispatching_control [jmc$min_dispatching_control].dispatching_priority :=
          jmc$priority_p5;

    service_class_p^.scheduling_priority.minimum := 8000;
    service_class_p^.scheduling_priority.maximum := 17000;
    service_class_p^.scheduling_priority.swap_age_increment := 1000;
    service_class_p^.scheduling_priority.ready_task_increment := 1000;
    service_class_p^.swap_age_interval := 1000000;


{ Initialize the UNASSIGNED service class.

    IF jmv$service_classes [jmc$unassigned_service_class] = NIL THEN
      ALLOCATE jmv$service_classes [jmc$unassigned_service_class] IN osv$mainframe_wired_heap^;
      pmp$zero_out_table (jmv$service_classes [jmc$unassigned_service_class],
            #SIZE (jmv$service_classes [jmc$unassigned_service_class]^));
    IFEND;
    service_class_p := ^jmv$service_classes [jmc$unassigned_service_class]^.attributes;
    service_class_p^ := jmv$default_service_class_attr;

{ Initialize the Definition group attributes.

    service_class_p^.defined := TRUE;
    service_class_p^.index := jmc$unassigned_service_class;
    service_class_p^.profile_identification := jmc$unassigned_class_name;
    service_class_p^.name := jmc$unassigned_class_name;
    service_class_p^.abbreviation := 'U';

{ Initialize the Control group attributes.

    service_class_p^.class_service_threshold := 10000000;
    service_class_p^.guaranteed_service_quantum := 9000;
    service_class_p^.maximum_active_jobs := 20;
    service_class_p^.next_service_class_index := jmc$unassigned_service_class;
    service_class_p^.service_factors [jmc$sf_cpu] := 1;
    service_class_p^.service_factors [jmc$sf_memory] := 1;
    service_class_p^.service_factors [jmc$sf_residence] := 1;
    service_class_p^.service_factors [jmc$sf_io] := 1;

{ Initialize the Prioirty group attributes.

    service_class_p^.dispatching_control [jmc$min_dispatching_control].dispatching_priority :=
          jmc$priority_p5;

    service_class_p^.scheduling_priority.minimum := 8000;
    service_class_p^.scheduling_priority.maximum := 17000;
    service_class_p^.scheduling_priority.swap_age_increment := 1000;
    service_class_p^.scheduling_priority.ready_task_increment := 1000;
    service_class_p^.swap_age_interval := 1000000;

{ Set the highest service class index currently used.

    jmv$max_service_class_in_use := jmc$minimum_service_classes;
    jmv$last_service_calc_time := #FREE_RUNNING_CLOCK (0);

  PROCEND initialize_service_class_table;
?? TITLE := '[XDCL, #GATE] jmp$initialize_scheduler_tables', EJECT ??
*copy jmh$initialize_scheduler_tables

  PROCEDURE [XDCL, #GATE] jmp$initialize_scheduler_tables
    (VAR status: ost$status);

    status.normal := TRUE;

    initialize_sched_tables_locks (status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

{ Update the default attribute record for the job and service classes.

    initialize_default_job_attr;

    initialize_default_service_attr;

{ Initialize the scheduler tables for job scheduler controls, job category data,
{ scheduling classes and applications.

    initialize_job_scheduler_table (status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    initialize_job_category_data;

    initialize_job_class_table;

    initialize_service_class_table (status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    initialize_output_class_table;

    initialize_application_table;

  PROCEND jmp$initialize_scheduler_tables;

MODEND jmm$job_sched_table_init;
