diff options
author | Andy Wingo <wingo@pobox.com> | 2016-11-01 22:48:19 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2016-11-01 22:48:19 +0100 |
commit | b410667e6434ef62a9c050dc4cbbff6f32a0c656 (patch) | |
tree | 0f45fe26d0b535e666f34280644a2b08248b0eee /libguile/async.c | |
parent | c88d0cc402f9146023df7d6c2309510882599eba (diff) | |
download | guile-b410667e6434ef62a9c050dc4cbbff6f32a0c656.tar.gz |
Simplify critical section implementation
* libguile/async.h (SCM_CRITICAL_SECTION_START)
(SCM_CRITICAL_SECTION_END): Define in just one way.
* libguile/async.c (critical_section_mutex): New static variable.
(scm_critical_section_start, scm_critical_section_end): Inline
internal body of critical section gates.
(scm_init_async): Init critical_section_mutex.
* libguile/threads.c (scm_threads_prehistory): Don't declare critical
section mutex here.
Diffstat (limited to 'libguile/async.c')
-rw-r--r-- | libguile/async.c | 16 |
1 files changed, 10 insertions, 6 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" } |