summaryrefslogtreecommitdiff
path: root/libguile/async.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-11-01 22:48:19 +0100
committerAndy Wingo <wingo@pobox.com>2016-11-01 22:48:19 +0100
commitb410667e6434ef62a9c050dc4cbbff6f32a0c656 (patch)
tree0f45fe26d0b535e666f34280644a2b08248b0eee /libguile/async.c
parentc88d0cc402f9146023df7d6c2309510882599eba (diff)
downloadguile-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.c16
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"
}