summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/async.c16
-rw-r--r--libguile/async.h32
-rw-r--r--libguile/threads.c6
3 files changed, 12 insertions, 42 deletions
diff --git a/libguile/async.c b/libguile/async.c
index aa4f508b7..d7b266bd2 100644
--- a/libguile/async.c
+++ b/libguile/async.c
@@ -299,21 +299,23 @@ scm_c_call_with_unblocked_asyncs (void *(*proc) (void *data), void *data)
}
-/* These are function variants of the same-named macros (uppercase) for use
- outside of libguile. This is so that `SCM_I_CURRENT_THREAD', which may
- reside in TLS, is not accessed from outside of libguile. It thus allows
- libguile to be built with the "local-dynamic" TLS model. */
+static scm_i_pthread_mutex_t critical_section_mutex;
void
scm_critical_section_start (void)
{
- SCM_CRITICAL_SECTION_START;
+ scm_i_pthread_mutex_lock (&critical_section_mutex);
+ SCM_I_CURRENT_THREAD->block_asyncs++;
+ SCM_I_CURRENT_THREAD->critical_section_level++;
}
void
scm_critical_section_end (void)
{
- SCM_CRITICAL_SECTION_END;
+ SCM_I_CURRENT_THREAD->critical_section_level--;
+ SCM_I_CURRENT_THREAD->block_asyncs--;
+ scm_i_pthread_mutex_unlock (&critical_section_mutex);
+ scm_async_tick ();
}
@@ -321,6 +323,8 @@ scm_critical_section_end (void)
void
scm_init_async ()
{
+ scm_i_pthread_mutex_init (&critical_section_mutex,
+ scm_i_pthread_mutexattr_recursive);
#include "libguile/async.x"
}
diff --git a/libguile/async.h b/libguile/async.h
index 578e901be..b709894c8 100644
--- a/libguile/async.h
+++ b/libguile/async.h
@@ -48,39 +48,11 @@ SCM_API void scm_dynwind_unblock_asyncs (void);
/* Critical sections */
-/* XXX - every critical section needs to be examined whether the
- requirements for SCM_CRITICAL_SECTION_START/END are fulfilled. See
- the manual.
-*/
-
-/* Defined in threads.c. */
-SCM_INTERNAL scm_i_pthread_mutex_t scm_i_critical_section_mutex;
-
SCM_API void scm_critical_section_start (void);
SCM_API void scm_critical_section_end (void);
-#ifdef BUILDING_LIBGUILE
-
-# define SCM_CRITICAL_SECTION_START \
- do { \
- scm_i_pthread_mutex_lock (&scm_i_critical_section_mutex); \
- SCM_I_CURRENT_THREAD->block_asyncs++; \
- SCM_I_CURRENT_THREAD->critical_section_level++; \
- } while (0)
-# define SCM_CRITICAL_SECTION_END \
- do { \
- SCM_I_CURRENT_THREAD->critical_section_level--; \
- SCM_I_CURRENT_THREAD->block_asyncs--; \
- scm_i_pthread_mutex_unlock (&scm_i_critical_section_mutex); \
- scm_async_tick (); \
- } while (0)
-
-#else /* !BUILDING_LIBGUILE */
-
-# define SCM_CRITICAL_SECTION_START scm_critical_section_start ()
-# define SCM_CRITICAL_SECTION_END scm_critical_section_end ()
-
-#endif /* !BUILDING_LIBGUILE */
+#define SCM_CRITICAL_SECTION_START scm_critical_section_start ()
+#define SCM_CRITICAL_SECTION_END scm_critical_section_end ()
SCM_INTERNAL void scm_init_async (void);
diff --git a/libguile/threads.c b/libguile/threads.c
index b2b352879..c27a7ea55 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -1939,10 +1939,6 @@ static scm_i_pthread_cond_t wake_up_cond;
static int threads_initialized_p = 0;
-/* This mutex is used by SCM_CRITICAL_SECTION_START/END.
- */
-scm_i_pthread_mutex_t scm_i_critical_section_mutex;
-
static SCM dynwind_critical_section_mutex;
void
@@ -1971,8 +1967,6 @@ scm_threads_prehistory (void *base)
PTHREAD_MUTEX_RECURSIVE);
#endif
- scm_i_pthread_mutex_init (&scm_i_critical_section_mutex,
- scm_i_pthread_mutexattr_recursive);
scm_i_pthread_mutex_init (&scm_i_misc_mutex, NULL);
scm_i_pthread_cond_init (&wake_up_cond, NULL);