summaryrefslogtreecommitdiff
path: root/libguile/deprecated.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-11-01 23:48:42 +0100
committerAndy Wingo <wingo@pobox.com>2016-11-01 23:48:42 +0100
commitfcc6a7ba20d08f81602b395c04e04f9acc8403e3 (patch)
tree53e77078b968146be913242d6d84930206a2be60 /libguile/deprecated.c
parent4b78b001d875cee7a4ee383f0cb498afc67835ee (diff)
downloadguile-fcc6a7ba20d08f81602b395c04e04f9acc8403e3.tar.gz
Deprecate critical sections
* NEWS: Deprecate critical sections. * doc/ref/api-scheduling.texi (Critical Sections): Remove. * libguile/async.c: * libguile/async.h: * libguile/deprecated.c: * libguile/deprecated.h: * libguile/threads.c: * libguile/threads.h: Deprecate critical section API.
Diffstat (limited to 'libguile/deprecated.c')
-rw-r--r--libguile/deprecated.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/libguile/deprecated.c b/libguile/deprecated.c
index 228c5d83b..c8d353f89 100644
--- a/libguile/deprecated.c
+++ b/libguile/deprecated.c
@@ -639,6 +639,44 @@ SCM_DEFINE (scm_run_asyncs, "run-asyncs", 1, 0, 0,
}
#undef FUNC_NAME
+
+static scm_i_pthread_mutex_t critical_section_mutex;
+static SCM dynwind_critical_section_mutex;
+
+void
+scm_critical_section_start (void)
+{
+ scm_c_issue_deprecation_warning
+ ("Critical sections are deprecated. Instead use dynwinds and "
+ "\"scm_dynwind_pthread_mutex_lock\" together with "
+ "\"scm_dynwind_block_asyncs\" if appropriate.");
+
+ scm_i_pthread_mutex_lock (&critical_section_mutex);
+ SCM_I_CURRENT_THREAD->block_asyncs++;
+}
+
+void
+scm_critical_section_end (void)
+{
+ SCM_I_CURRENT_THREAD->block_asyncs--;
+ scm_i_pthread_mutex_unlock (&critical_section_mutex);
+ scm_async_tick ();
+}
+
+void
+scm_dynwind_critical_section (SCM mutex)
+{
+ scm_c_issue_deprecation_warning
+ ("Critical sections are deprecated. Instead use dynwinds and "
+ "\"scm_dynwind_pthread_mutex_lock\" together with "
+ "\"scm_dynwind_block_asyncs\" if appropriate.");
+
+ if (scm_is_false (mutex))
+ mutex = dynwind_critical_section_mutex;
+ scm_dynwind_lock_mutex (mutex);
+ scm_dynwind_block_asyncs ();
+}
+
@@ -648,6 +686,9 @@ scm_i_init_deprecated ()
scm_tc16_arbiter = scm_make_smob_type ("arbiter", 0);
scm_set_smob_print (scm_tc16_arbiter, arbiter_print);
tc16_async = scm_make_smob_type ("async", 0);
+ scm_i_pthread_mutex_init (&critical_section_mutex,
+ scm_i_pthread_mutexattr_recursive);
+ dynwind_critical_section_mutex = scm_make_recursive_mutex ();
#include "libguile/deprecated.x"
}