diff options
-rw-r--r-- | libguile/async.c | 16 | ||||
-rw-r--r-- | libguile/async.h | 32 | ||||
-rw-r--r-- | libguile/threads.c | 6 |
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); |