From c72cc5fbe440b7806099b41b32b8b8729798a6f2 Mon Sep 17 00:00:00 2001 From: Mikael Djurfeldt Date: Fri, 30 Jan 1998 21:06:16 +0000 Subject: [PATCH] * __scm.h (SCM_ASYNC_TICK): Removed thread switching code. (SCM_ALLOW_INTS): Added thread switching code before interrupts get re-enabled. The important effect of this is that interrupts are blocked during thread switching so that thread data structures don't risk getting messed up by an unfortunate signal. (SCM_REDEFER_INTS, SCM_REALLOW_INTS): It turned out that gcc-2.8.0 seems to do more aggressive optimization which actually move instructions around in these macros in a fatal way. Therefore: Introduce Anthony's SCM_FENCE macro! (And I who thought he was just superstitious...) (SCM_TICK): Maybe do a context switch and take care of asyncs. This macro should be used instead of SCM_ASYNC_TICK since the latter doesn't do context switches any more. --- libguile/__scm.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/libguile/__scm.h b/libguile/__scm.h index b7508edb6..a3e867d88 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -252,23 +252,13 @@ typedef long SCM_STACKITEM; #endif extern unsigned int scm_async_clock; -#if 0 + #define SCM_ASYNC_TICK \ { \ if (0 == --scm_async_clock) \ scm_async_click (); \ } \ -#else -#define SCM_ASYNC_TICK \ -{ \ - if (0 == --scm_async_clock) \ - scm_async_click (); \ - SCM_THREAD_SWITCHING_CODE; \ -} \ - -#endif - #ifdef SCM_CAREFUL_INTS #define SCM_CHECK_NOT_DISABLED \ if (scm_ints_disabled) \ @@ -326,6 +316,8 @@ extern unsigned int scm_async_clock; { \ SCM_FENCE; \ SCM_CHECK_NOT_ENABLED; \ + SCM_THREAD_SWITCHING_CODE; \ + SCM_FENCE; \ scm_ints_disabled = 0; \ SCM_FENCE; \ SCM_THREAD_ALLOW; \ @@ -336,23 +328,34 @@ extern unsigned int scm_async_clock; #define SCM_REDEFER_INTS \ { \ + SCM_FENCE; \ SCM_THREAD_REDEFER; \ ++scm_ints_disabled; \ + SCM_FENCE; \ } \ #define SCM_REALLOW_INTS \ { \ + SCM_FENCE; \ SCM_THREAD_REALLOW_1; \ + SCM_THREAD_SWITCHING_CODE; \ + SCM_FENCE; \ --scm_ints_disabled; \ if (!scm_ints_disabled) \ { \ SCM_THREAD_REALLOW_2; \ SCM_ASYNC_TICK; \ } \ + SCM_FENCE; \ } \ +#define SCM_TICK \ +{ \ + SCM_DEFER_INTS; \ + SCM_ALLOW_INTS; \ +} \