summaryrefslogtreecommitdiff
path: root/libguile/async.c
diff options
context:
space:
mode:
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"
}