diff options
author | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1998-01-30 21:06:16 +0000 |
---|---|---|
committer | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1998-01-30 21:06:16 +0000 |
commit | c72cc5fbe440b7806099b41b32b8b8729798a6f2 (patch) | |
tree | 0a482a769a25fc85454fe5d7d5938b0d0353bab0 | |
parent | 13dc0cae2fab2f8295aa6b6e831795b1e5e377f0 (diff) | |
download | guile-c72cc5fbe440b7806099b41b32b8b8729798a6f2.tar.gz |
* __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.
-rw-r--r-- | libguile/__scm.h | 23 |
1 files changed, 13 insertions, 10 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; \ +} \ |