Copyright (C) 1994, Digital Equipment Corp.
UNSAFE MODULE--------------------------------------------------------- thread stacks ---; IMPORT Usignal, Word; CONST SP_pos = 1; FP_pos = 2; PROCEDURE RTThread SP (READONLY s: State): ADDRESS = BEGIN RETURN LOOPHOLE (s [SP_pos], ADDRESS); END SP;
PROCEDURE-------------------------------------------------- modifying the models ---NewStack (size: INTEGER; VAR(*OUT*)s: Stack) = BEGIN s.words := NEW (StackSpace, size); s.first := ADR (s.words[0]); s.last := s.first + size * ADRSIZE (s.words[0]); END NewStack; PROCEDUREDisposeStack (VAR s: Stack) = BEGIN DISPOSE (s.words); s.words := NIL; s.first := NIL; s.last := NIL; END DisposeStack; PROCEDUREFlushStackCache () = VAR d: State; BEGIN Transfer (d, d); END FlushStackCache;
PROCEDURE------------------------------------ manipulating the SIGVTALRM handler ---UpdateStateForNewSP (VAR s: State; offset: INTEGER) = BEGIN INC (s [SP_pos], offset); INC (s [FP_pos], offset); END UpdateStateForNewSP; PROCEDUREUpdateFrameForNewSP (<*UNUSED*> a: ADDRESS; <*UNUSED*> offset: INTEGER) = BEGIN END UpdateFrameForNewSP;
PROCEDUREsetup_sigvtalrm (handler: Usignal.SignalHandler) = VAR sv, osv: Usignal.struct_sigvec; i: INTEGER; BEGIN sv.sv_handler := handler; sv.sv_mask := Usignal.empty_sv_mask; sv.sv_flags := 0; i := Usignal.sigvec (Usignal.SIGVTALRM, sv, osv); <* ASSERT i = 0 *> END setup_sigvtalrm; PROCEDUREallow_sigvtalrm () = VAR i : Word.T; BEGIN i := Usignal.sigsetmask (0); i := Word.And (i, Word.Not (Usignal.sigmask (Usignal.SIGVTALRM))); EVAL Usignal.sigsetmask (i); END allow_sigvtalrm; PROCEDUREdisallow_sigvtalrm () = VAR i : Word.T; BEGIN i := Usignal.sigsetmask (0); i := Word.Or (i, Usignal.sigmask (Usignal.SIGVTALRM)); EVAL Usignal.sigsetmask (i); END disallow_sigvtalrm; BEGIN END RTThread.