MODULE tmm$ring1_helper;
?? RIGHT := 110 ??

{ PURPOSE:
{   Support for tmp$fetch_job_statistics

?? NEWTITLE := 'Global Declarations referenced by this module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc jmt$dispatching_priority
*copyc jmt$job_statistics
*copyc ost$status
?? POP ??
*copyc pmp$find_executing_task_xcb
*copyc jmv$ijl_p
*copyc jmv$jcb
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] TMP$FETCH_JOB_STATISTICS', EJECT ??

  PROCEDURE [XDCL, #GATE] tmp$fetch_job_statistics
    (VAR statistics: jmt$job_statistics;
     VAR status: ost$status);

*copyc tmh$fetch_job_statistics

    status.normal := TRUE;
    statistics.cp_time := jmv$jcb.ijle_p^.statistics.cp_time;

{   The working set size must be captured before the paging statistics because it is possible
{   for a page fault to occur, either for this task or an asynchronous task, and the maximum
{   working set could end up less than the current working set.

    statistics.working_set_size := jmv$jcb.ijle_p^.job_page_queue_list [mmc$pq_job_working_set].count;
    statistics.paging_statistics := jmv$jcb.ijle_p^.statistics.paging_statistics;
    statistics.ready_task_count := jmv$jcb.ijle_p^.statistics.ready_task_count;
    jmv$jcb.ijle_p^.statistics.paging_statistics.incremental_max_ws := statistics.working_set_size;

  PROCEND tmp$fetch_job_statistics;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] TMP$SET_FLAG_INTERVAL', EJECT ??

  PROCEDURE [XDCL, #GATE] tmp$set_flag_interval
    (    interval: 0 .. 0ffffffff(16));

*copyc tmh$set_flag_interval

    jmv$jcb.signal_interval := interval;

  PROCEND tmp$set_flag_interval;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] TMP$SET_TASK_PRIORITY', EJECT ??

{ This procedure is used to change the priority of the executing task.
{ Input parameters are:
{    dispatching_priority - If this parameter is non-zero, it specifies the absolute
{                   priority for the task.
{    dispatching_priority_bias -  If dispatching_priority is not specified, this parameter specifies
{                   a bias to be applied to the job priority to give the task priority

  PROCEDURE [XDCL, #GATE] tmp$set_task_priority
    (    dispatching_priority: jmt$dispatching_priority;
         dispatching_priority_bias: jmt$dispatching_priority_bias;
     VAR status: ost$status);

    VAR
      xcb_p: ^ost$execution_control_block,
      priority: integer;

    status.normal := TRUE;
    pmp$find_executing_task_xcb (xcb_p);
    IF dispatching_priority = 0 THEN
      IF dispatching_priority_bias >= 0 THEN
        xcb_p^.dispatching_priority_bias_id := jmc$dpb_positive;
        xcb_p^.dispatching_priority_bias := dispatching_priority_bias;
        priority := jmv$jcb.ijle_p^.dispatching_control.dispatching_priority + dispatching_priority_bias;
      ELSE
        xcb_p^.dispatching_priority_bias_id := jmc$dpb_negative;
        xcb_p^.dispatching_priority_bias := -dispatching_priority_bias;
        priority := jmv$jcb.ijle_p^.dispatching_control.dispatching_priority - dispatching_priority_bias;
      IFEND;
    ELSE
      priority := dispatching_priority;
      xcb_p^.dispatching_priority_bias_id := jmc$dpb_absolute;
    IFEND;

    IF priority > jmc$max_dispatching_priority THEN
      priority := jmc$max_dispatching_priority;
    ELSEIF priority < jmc$min_dispatching_priority THEN
      priority := jmc$min_dispatching_priority;
    IFEND;

    xcb_p^.dispatching_priority := priority;

  PROCEND tmp$set_task_priority;
?? OLDTITLE ??
MODEND tmm$ring1_helper;
