MODULE pmm$multi_task_conditions;

?? NEWTITLE := 'Global Declarations' ??
?? PUSH (LISTEXT := ON) ??
*copyc osc$unseen_mail_condition
*copyc osd$default_pragmats
*copyc ost$global_task_id
*copyc pme$condition_exceptions
*copyc pmt$condition_name
*copyc pmt$task_id
?? POP ??
*copyc clp$find_unseen_mail_action
*copyc clp$validate_name
*copyc osp$set_status_abnormal
*copyc pmp$cause_task_condition
*copyc pmp$find_task_xcb
*copyc pmp$post_unseen_mail
*copyc pmp$propagate_unseen_mail
*copyc pmp$send_signal
*copyc tmc$signal_identifiers

?? TITLE := 'pmp$cause_inter_job_condition', EJECT ??

  PROCEDURE [XDCL, #GATE] pmp$cause_inter_job_condition
    (    condition: pmt$condition_name;
         task_id: ost$global_task_id;
     VAR status: ost$status);

    VAR
      signal: pmt$signal,
      vn: ost$name,
      valid: boolean,
      p_condition: ^pmt$condition_name;

    clp$validate_name (condition, vn, valid);
    IF NOT valid THEN
      osp$set_status_abnormal (pmc$program_management_id,
            pme$incorrect_condition_name, vn, status);
      RETURN;
    IFEND;
    IF (vn (1, 4) = 'CYE$') OR (vn (1, 4) = 'OSC$') THEN
      osp$set_status_abnormal (pmc$program_management_id,
            pme$incorrect_condition_name, vn, status);
      RETURN;
    IFEND;

    signal.identifier := pmc$multi_task_condition;
    p_condition := #LOC (signal.contents);
    p_condition^ := condition;

    pmp$send_signal (task_id, signal, status);

  PROCEND pmp$cause_inter_job_condition;
?? TITLE := 'pmp$multi_task_signal_handler', EJECT ??

  PROCEDURE [XDCL] pmp$multi_task_signal_handler
    (    originator: ost$global_task_id;
         signal: pmt$signal);

    VAR
      ignore_status: ost$status,
      p_condition: ^pmt$condition_name,
      unseen_mail_action: ^clt$unseen_mail_action;


    p_condition := #LOC (signal.contents);

    IF p_condition^ <> osc$unseen_mail_condition THEN
      pmp$cause_task_condition (p_condition^, NIL, FALSE, FALSE, FALSE, FALSE,
            ignore_status);
    ELSE
      clp$find_unseen_mail_action (unseen_mail_action);
      IF unseen_mail_action^ = clc$post_unseen_mail THEN
        pmp$post_unseen_mail;
      ELSE
        pmp$propagate_unseen_mail (ignore_status);
      IFEND;
    IFEND;

  PROCEND pmp$multi_task_signal_handler;

MODEND pmm$multi_task_conditions;
