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

{PURPOSE:
{  This module contains two procedures used to define and ready system tasks.
{  Using this interface a system task can be made ready-ed by a task in another job which need
{  the system task to process a request.
{  This method may use much fewer system resources than polling.
{
{    TMP$READY_SYSTEM_TASK is the handler which a task would use to wake up a task it has made a request to.
{    TMP$SAVE_SYSTEM_TASK_ID is the handler used by a system task to identify the task to the system.

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc i#call_monitor
*copyc syc$monitor_request_codes
*copyc tme$monitor_mode_exceptions
*copyc ost$status
*copyc syt$monitor_request_code
*copyc tmt$rb_manage_system_tasks
?? POP ??
*copyc osp$set_status_condition
*copyc jmv$jcb
*copyc jmv$system_ajl_ordinal
?? OLDTITLE ??
?? NEWTITLE := 'PROCEDURE tmp$save_system_task_id', EJECT ??

  PROCEDURE [XDCL, #GATE] tmp$save_system_task_id
    (    stid: tmt$system_task_id;
         critical_task: boolean;
     VAR status: ost$status);

    VAR
      request_block: tmt$rb_manage_system_tasks;

    status.normal := TRUE;
    IF jmv$jcb.ijle_p^.ajl_ordinal = jmv$system_ajl_ordinal THEN
      request_block.reqcode := syc$rc_manage_system_tasks;
      request_block.stid := stid;
      request_block.critical_task := critical_task;
      request_block.save_task_id := TRUE;
      i#call_monitor (#LOC (request_block), #SIZE (request_block));
      IF NOT request_block.status.normal THEN
        osp$set_status_condition (request_block.status.condition, status);
      IFEND;
    ELSE
      osp$set_status_condition (tme$invalid_system_task, status);
    IFEND;

  PROCEND tmp$save_system_task_id;
?? OLDTITLE ??
?? NEWTITLE := 'PROCEDURE tmp$ready_system_task', EJECT ??

  PROCEDURE [XDCL, #GATE] tmp$ready_system_task
    (    stid: tmt$system_task_id;
     VAR status: ost$status);

    VAR
      request_block: tmt$rb_manage_system_tasks;

    status.normal := TRUE;
    request_block.reqcode := syc$rc_manage_system_tasks;
    request_block.stid := stid;
    request_block.save_task_id := FALSE;
    i#call_monitor (#LOC (request_block), #SIZE (request_block));
    IF NOT request_block.status.normal THEN
      osp$set_status_condition (request_block.status.condition, status);
    IFEND;

  PROCEND tmp$ready_system_task;
?? OLDTITLE ??
MODEND tmm$system_task_manager_r3;

