
?? RIGHT := 110 ??
MODULE osm$system_error_processors;
{
{ This module contains routines that are called to process system errors
{
?? PUSH (LISTEXT := ON) ??
*copyc OSD$REGISTERS
*copyc OSE$HEAP_FULL_EXCEPTIONS
*copyc OST$RB_SYSTEM_ERROR


?? POP ??
*copyc I#CALL_MONITOR
*copyc osp$check_for_job_recovery
*copyc osp$log_system_error

?? TITLE := 'osp$system_error', EJECT ??
  PROCEDURE [XDCL, #GATE] osp$system_error (text: string ( * );
        status_p: ^ost$status);

    VAR
      p_reqister_p: ^ost$p_register,
      rb: ost$rb_system_error,
      status: ost$status;

    osp$log_system_error (text, 'SYSTEM ERROR - ');

    p_reqister_p := #previous_save_area ();
    rb.reqcode := syc$rc_system_error;
    rb.fatal := FALSE;
    rb.caller_p_register := p_reqister_p^;
    rb.text := text;
    rb.text_p := ^text;
    rb.status_p := status_p;
    IF status_p <> NIL THEN
      rb.condition := status_p^.condition;
    IFEND;

{ Check if job is in job recovery.  If it is, control will not return here.

    osp$check_for_job_recovery ('SYSTEM ERROR during job recovery');

    WHILE TRUE DO
      i#call_monitor (#LOC (rb), #SIZE (rb));
    WHILEND;

  PROCEND osp$system_error;
?? TITLE := 'osp$fatal_system_error', EJECT ??
  PROCEDURE [XDCL] osp$fatal_system_error (text: string ( * );
        status_p: ^ost$status);

    VAR
      p_reqister_p: ^ost$p_register,
      rb: ost$rb_system_error;

    osp$log_system_error (text, 'FATAL SYSTEM ERROR - ');

    p_reqister_p := #previous_save_area ();
    rb.reqcode := syc$rc_system_error;
    rb.fatal := TRUE;
    rb.caller_p_register := p_reqister_p^;
    rb.text := text;
    rb.text_p := ^text;
    rb.status_p := status_p;
    IF status_p <> NIL THEN
      rb.condition := status_p^.condition;
    IFEND;

    WHILE TRUE DO
      i#call_monitor (#LOC (rb), #SIZE (rb));
    WHILEND;

  PROCEND osp$fatal_system_error;
?? TITLE := 'PROCEDURE cyp$error', EJECT ??

  PROCEDURE [XDCL] cyp$error (ec: integer;
        line: integer;
        module_p: ^string (31));

    VAR
      s: string (63),
      k: integer;

    s := 'CYBIL ERROR xx AT LINE xxxxx OF mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm';
    s (14) := CHR ((ec MOD 10) + ORD ('0'));
    s (13) := CHR ((ec DIV 10) + ORD ('0'));
    s (28) := CHR ((line MOD 10) + ORD ('0'));
    s (27) := CHR (((line MOD 100) DIV 10) + ORD ('0'));
    s (26) := CHR (((line MOD 1000) DIV 100) + ORD ('0'));
    s (25) := CHR (((line MOD 10000) DIV 1000) + ORD ('0'));
    s (24) := CHR ((line DIV 10000) + ORD ('0'));
    s (33, 31) := module_p^;

    osp$system_error (s, NIL);
  PROCEND cyp$error;
?? SKIP := 2 ??

  PROCEDURE [XDCL] cyp$nil;

    osp$system_error ('CYP$NIL called in system core', NIL);

  PROCEND cyp$nil;

MODEND
