?? LEFT := 1, RIGHT := 110 ??
??
FMT (FORMAT := ON, keyw := upper, ident := lower) ??
?? SET (LISTCTS := OFF) ??
MODULE ifm$send_interrupt_condition;

{
{   The purpose of this module is to process the request to send an interactive
{ interrupt condition to a task.
{

?? PUSH (LISTEXT := ON) ??
*copyc tmc$signal_identifiers
*copyc iit$interactive_signal_type
*copyc osp$set_status_abnormal
*copyc pmc$program_management_id
*copyc pme$execution_exceptions
*copyc pme$unknown_recipient_task
*copyc pmp$get_global_task_id
*copyc pmp$send_signal
?? POP ??
?? TITLE := 'IFP$SEND_INTERRUPT_CONDITION', EJECT ??
*copyc ifh$send_interrupt_condition

  PROCEDURE [XDCL, #GATE] ifp$send_interrupt_condition (task_id: pmt$task_id;
    VAR status: ost$status);

    VAR
      signal: pmt$signal,
      global_task_id: ost$global_task_id,
      local_status: ost$status;

    IF (task_id < LOWERVALUE (task_id)) OR (task_id > UPPERVALUE (task_id)) THEN
      osp$set_status_abnormal (pmc$program_management_id, pme$invalid_task_id, '', local_status)
    ELSE
      pmp$get_global_task_id (task_id, global_task_id, local_status);
    IFEND;

    IF local_status.normal THEN
      signal.identifier := ifc$signal_id;
      signal.contents [1] := $INTEGER (iic$interrupt);
      pmp$send_signal (global_task_id, signal, local_status);
      IF NOT local_status.normal AND (local_status.condition = pme$unknown_recipient_task) THEN
        osp$set_status_abnormal (pmc$program_management_id, pme$unknown_task_id, '', local_status);
      IFEND;
    IFEND;

    status := local_status;
  PROCEND ifp$send_interrupt_condition;
MODEND ifm$send_interrupt_condition;
