EPHEMERAL.
EPHEMERAL procedure is only allowed to call other
EPHEMERAL procedures. The base system-provided routines
that allocate memory or involve synchronization -- &,
NEW, LOCK DO -- are defined as
non-EPHEMERAL.
We allow an EPHEMERAL procedure in an UNSAFE
module to call non-EPHEMERAL procedures.
PROCEDURE can be preceded by the keyword
EPHEMERAL, both in a procedure type or a procedure
definition.
EPHEMERAL PROCEDURE KillMe() =
BEGIN
WHILE TRUE DO
(* infinite loop *)
END;
END KillMe;
PROCEDURE CannotKill() =
VAR NewMemory : REF INTEGER;
BEGIN
(* NEW is not EPHEMERAL, so CannotKill cannot be EPHEMERAL *)
NewMemory = NEW (REF INTEGER);
END CannotKill;