summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>1998-01-30 21:06:16 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>1998-01-30 21:06:16 +0000
commitc72cc5fbe440b7806099b41b32b8b8729798a6f2 (patch)
tree0a482a769a25fc85454fe5d7d5938b0d0353bab0
parent13dc0cae2fab2f8295aa6b6e831795b1e5e377f0 (diff)
downloadguile-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.h23
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; \
+} \