Copyright (C) 1994, Digital Equipment Corp.
UNSAFE MODULE--------------------------------------------------------- thread stacks ---; IMPORT Usignal, Word; PROCEDURE RTThread SP (READONLY s: State): ADDRESS = BEGIN RETURN LOOPHOLE (s.sp, 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, offset); INC (s.bp, offset); END UpdateStateForNewSP; PROCEDUREUpdateFrameForNewSP (<*UNUSED*> a: ADDRESS; <*UNUSED*> offset: INTEGER) = BEGIN END UpdateFrameForNewSP;
PROCEDUREsetup_sigvtalrm (handler: Usignal.SignalHandler) = VAR x: Usignal.struct_sigaction; BEGIN x.sa_handler := LOOPHOLE (handler, Usignal.SignalActionHandler); x.sa_mask := 0; x.sa_flags := 0; EVAL Usignal.sigaction (Usignal.SIGVTALRM, ADR (x), NIL); 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.