?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE: Program Control - Process Interval Timer Manager' ??
MODULE pmm$process_interval_timer_mgr;




{   PURPOSE:
{     The purpose of this module is contain the procedures which manage the
{     process interval timer for program condition and the same time confine
{     the knowledge to this module.

{   DESIGN:
{     This module is designed to execute in rings 2 - 3.  The XDCL, #GATEed
{     procedures have a call bracket of 13.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc osc$processor_defined_registers
*copyc osd$virtual_address
*copyc oss$task_private
*copyc ost$caller_identifier
*copyc ost$status
*copyc pme$condition_exceptions
*copyc pmt$pit_value
?? POP ??
*copyc osp$set_status_condition
*copyc osp$verify_system_privilege
*copyc syp$set_process_interval_timer
?? OLDTITLE ??
?? NEWTITLE := 'Global Declarations Declared by This Module', EJECT ??

  VAR
    pmv$pit_has_been_set: [STATIC, oss$task_private] boolean := FALSE,
    pmv$pit_was_set_in_ch: [STATIC, oss$task_private] boolean,
    pmv$where_pit_can_be_cleared: [STATIC, oss$task_private] ost$ring := LOWERVALUE (ost$ring);

?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$set_process_interval_timer', EJECT ??
*copy pmh$set_process_interval_timer

  PROCEDURE [XDCL, #GATE] pmp$set_process_interval_timer
    (    microseconds: pmt$pit_value;
     VAR status: ost$status);

    status.normal := TRUE;
    IF (microseconds >= LOWERVALUE (pmt$pit_value)) AND (microseconds <= UPPERVALUE (pmt$pit_value)) THEN
      syp$set_process_interval_timer (microseconds, status);
      IF status.normal THEN
        pmv$pit_has_been_set := TRUE;
        pmv$pit_was_set_in_ch := TRUE; { Assume this is true for DISPOSE_PIT_CONDITION }
        pmv$where_pit_can_be_cleared := LOWERVALUE (pmv$where_pit_can_be_cleared);
      IFEND;
    ELSE
      osp$set_status_condition (pme$pit_value_out_of_range, status);
    IFEND;

  PROCEND pmp$set_process_interval_timer;

?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$pit_was_set', EJECT ??

  FUNCTION [XDCL, #GATE] pmp$pit_was_set: boolean;

    osp$verify_system_privilege;
    pmp$pit_was_set := pmv$pit_has_been_set;

  FUNCEND pmp$pit_was_set;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$set_where_pit_can_be_cleard', EJECT ??

  PROCEDURE [XDCL, #GATE] pmp$set_where_pit_can_be_cleard;


    VAR
      caller: ost$caller_identifier;


    #CALLER_ID (caller);

    osp$verify_system_privilege;
    IF caller.ring >= pmv$where_pit_can_be_cleared THEN
      pmv$where_pit_can_be_cleared := caller.ring + 1;
    IFEND;

  PROCEND pmp$set_where_pit_can_be_cleard;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$clear_pit_has_been_set', EJECT ??

  PROCEDURE [XDCL, #GATE] pmp$clear_pit_has_been_set;


    VAR
      caller: ost$caller_identifier;


    #CALLER_ID (caller);

    osp$verify_system_privilege;
    IF caller.ring >= pmv$where_pit_can_be_cleared THEN
      pmv$pit_has_been_set := FALSE;
    IFEND;

  PROCEND pmp$clear_pit_has_been_set;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$clear_pit_was_set_in_ch', EJECT ??

{ PURPOSE:
{   This routine helps remember if the pit was set inside a condition handler
{   for DISPOSE_PIT_CONDITION in PMM$DISPOSE_OF_CONDITIONS.

  PROCEDURE [XDCL, #GATE] pmp$clear_pit_was_set_in_ch;

    osp$verify_system_privilege;
    pmv$pit_was_set_in_ch := FALSE;

  PROCEND pmp$clear_pit_was_set_in_ch;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] pmp$pit_was_set_in_ch', EJECT ??

{ PURPOSE:
{   This routine helps remember if the pit was set inside a condition handler
{   for DISPOSE_PIT_CONDITION in PMM$DISPOSE_OF_CONDITIONS.

  FUNCTION [XDCL, #GATE] pmp$pit_was_set_in_ch: boolean;

    osp$verify_system_privilege;
    pmp$pit_was_set_in_ch := pmv$pit_was_set_in_ch;

  FUNCEND pmp$pit_was_set_in_ch;
?? OLDTITLE ??

MODEND pmm$process_interval_timer_mgr;
