?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE: Program Management - Run-anywhere Program Services' ??
MODULE pmm$runanywhere_prg_services;
?? RIGHT := 110 ??


{   PURPOSE:
{     This module contains procedures to process the following requests:
{       pmp$cycle
{       pmp$delay
{       syp$wait
{

{   DESIGN:
{     The procedures contained in the module are designed to execute with an
{     execute bracket of 1, 13 and a call bracket of 13.
{
?? NEWTITLE := 'Global System Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc syc$monitor_request_codes
*copyc ost$status
*copyc tmt$rb_cycle
*copyc tmt$rb_delay
?? POP ??
*copyc i#call_monitor
?? TITLE := '  [XDCL, #gate] pmp$delay', EJECT ??

  PROCEDURE [XDCL, #GATE] pmp$delay
    (    milliseconds: integer;
     VAR status: ost$status);

*copyc pmh$delay

    CONST
      max_delay_time = 0ffffffffffff(16);

    VAR
      delay_time: integer,
      end_time: integer,
      delay: tmt$rb_delay;

    status.normal := TRUE;
    delay_time := milliseconds * 1000;
    end_time := delay_time + #FREE_RUNNING_CLOCK (0);
    IF end_time > max_delay_time THEN
      end_time := max_delay_time;
      IF delay_time > max_delay_time THEN
        delay_time := max_delay_time;
      IFEND;
    IFEND;

    delay.reqcode := syc$rc_delay;
    delay.expected_wait_time := delay_time;
    delay.requested_wait_time := end_time;

    WHILE (#FREE_RUNNING_CLOCK (0) < delay.requested_wait_time) DO
      i#call_monitor (#LOC (delay), #SIZE (delay));
    WHILEND;

  PROCEND pmp$delay;
?? TITLE := '  [XDCL, #gate] pmp$cycle', EJECT ??

  PROCEDURE [XDCL, #GATE] pmp$cycle
    (VAR status: ost$status);

*copyc pmh$cycle

    TYPE
      psa_type = record
        fill: 0 .. 0ffff(16),
        p: ^cell,
        a0,
        a1: integer,
        fill2: 0 .. 0ffff(16),
        a2: ^psa_type,
      recend;

    VAR
      psa: ^psa_type,
      cycle_task: tmt$rb_cycle;

    status.normal := TRUE;
    cycle_task.reqcode := syc$rc_cycle;
    cycle_task.code := tmc$cyc_cycle_request;
    psa := #PREVIOUS_SAVE_AREA ();
    cycle_task.p1 := psa^.p;
    IF psa^.a2 = NIL THEN
      cycle_task.p2 := NIL;
    ELSE
      cycle_task.p2 := psa^.a2^.p;
    IFEND;
    cycle_task.lock_value := 0;
    i#call_monitor (#LOC (cycle_task), #SIZE (cycle_task));

  PROCEND pmp$cycle;
?? TITLE := '  [XDCL, #gate] syp$wait', EJECT ??

  PROCEDURE [XDCL, #GATE] syp$wait
    (    milliseconds: 0 .. 0ffffffffffff(16));

*copyc syh$wait

    CONST
      max_wait_time = 0ffffffffffff(16);

    VAR
      end_time: integer,
      rb: tmt$rb_delay,
      wait_time: integer;

    wait_time := milliseconds * 1000;
    end_time := wait_time + #FREE_RUNNING_CLOCK (0);
    IF end_time > max_wait_time THEN
      end_time := max_wait_time;
      IF wait_time > max_wait_time THEN
        wait_time := max_wait_time;
      IFEND;
    IFEND;

    rb.reqcode := syc$rc_delay;
    rb.expected_wait_time := wait_time;
    rb.requested_wait_time := end_time;

    i#call_monitor (#LOC (rb), #SIZE (rb));

  PROCEND syp$wait;
MODEND pmm$runanywhere_prg_services;
