Copyright (C) 1994, Digital Equipment Corp.
UNSAFE MODULE--------------------------------------------------------- thread stacks ---; IMPORT Usignal; CONST SP_pos = 3; 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 () = BEGIN END FlushStackCache;
PROCEDURE------------------------------------ manipulating the SIGVTALRM handler ---UpdateStateForNewSP (VAR s: State; offset: INTEGER) = BEGIN INC (s [SP_pos], offset); END UpdateStateForNewSP; PROCEDUREUpdateFrameForNewSP (<*UNUSED*> a: ADDRESS; <*UNUSED*> offset: INTEGER) = BEGIN END UpdateFrameForNewSP;
VAR ThreadSwitchSignal: Usignal.sigset_t; PROCEDUREmask_sigvtalrm (VAR i: Usignal.sigset_t) = BEGIN IF Usignal.SIGVTALRM <= 32 THEN i.losigs := Usignal.sigmask (Usignal.SIGVTALRM); i.hisigs := 0 ELSE i.losigs := 0; i.hisigs := Usignal.sigmask (Usignal.SIGVTALRM-32) END END mask_sigvtalrm; PROCEDUREsetup_sigvtalrm (handler: Usignal.SignalHandler) = VAR sa, osa: Usignal.struct_sigaction; i: INTEGER; BEGIN sa.sa_handler := handler; sa.sa_mask := Usignal.empty_sigset_t; sa.sa_flags := 0; i := Usignal.sigaction (Usignal.SIGVTALRM, sa, osa); <* ASSERT i = 0 *> END setup_sigvtalrm; PROCEDUREallow_sigvtalrm () = VAR i : Usignal.sigset_t; BEGIN EVAL Usignal.sigprocmask(Usignal.SIG_UNBLOCK, ThreadSwitchSignal, i) END allow_sigvtalrm; PROCEDUREdisallow_sigvtalrm () = VAR i : Usignal.sigset_t; BEGIN EVAL Usignal.sigprocmask(Usignal.SIG_BLOCK, ThreadSwitchSignal, i) END disallow_sigvtalrm; BEGIN mask_sigvtalrm(ThreadSwitchSignal); END RTThread.