summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/eval.c5
-rw-r--r--libguile/null-threads.h2
-rw-r--r--libguile/pthread-threads.h3
-rw-r--r--libguile/threads.c15
4 files changed, 19 insertions, 6 deletions
diff --git a/libguile/eval.c b/libguile/eval.c
index e4e617fe1..3cdf9346a 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -2655,7 +2655,7 @@ static SCM deval (SCM x, SCM env);
? SCM_CAR (x) \
: *scm_lookupcar ((x), (env), 1)))))
-scm_i_pthread_mutex_t source_mutex = SCM_I_PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
+scm_i_pthread_mutex_t source_mutex;
/* Lookup a given local variable in an environment. The local variable is
@@ -6022,6 +6022,9 @@ SCM (*scm_ceval_ptr) (SCM x, SCM env) = dispatching_eval;
void
scm_init_eval ()
{
+ scm_i_pthread_mutex_init (&source_mutex,
+ scm_i_pthread_mutexattr_recursive);
+
scm_init_opts (scm_evaluator_traps,
scm_evaluator_trap_table,
SCM_N_EVALUATOR_TRAPS);
diff --git a/libguile/null-threads.h b/libguile/null-threads.h
index 7014d370d..a691a68fd 100644
--- a/libguile/null-threads.h
+++ b/libguile/null-threads.h
@@ -50,13 +50,13 @@
/* Mutexes
*/
#define SCM_I_PTHREAD_MUTEX_INITIALIZER 0
-#define SCM_I_PTHREAD_RECURSIVE_MUTEX_INITIALIZER 0
#define scm_i_pthread_mutex_t int
#define scm_i_pthread_mutex_init(m,a) (*(m) = 0)
#define scm_i_pthread_mutex_destroy(m) do { (void)(m); } while(0)
#define scm_i_pthread_mutex_trylock(m) ((*(m))++)
#define scm_i_pthread_mutex_lock(m) ((*(m))++)
#define scm_i_pthread_mutex_unlock(m) ((*(m))--)
+#define scm_i_pthread_mutexattr_recursive 0
/* Condition variables
*/
diff --git a/libguile/pthread-threads.h b/libguile/pthread-threads.h
index 6550aab93..b6a820ada 100644
--- a/libguile/pthread-threads.h
+++ b/libguile/pthread-threads.h
@@ -44,14 +44,13 @@
/* Mutexes
*/
#define SCM_I_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
-#define SCM_I_PTHREAD_RECURSIVE_MUTEX_INITIALIZER \
- PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
#define scm_i_pthread_mutex_t pthread_mutex_t
#define scm_i_pthread_mutex_init pthread_mutex_init
#define scm_i_pthread_mutex_destroy pthread_mutex_destroy
#define scm_i_pthread_mutex_trylock pthread_mutex_trylock
#define scm_i_pthread_mutex_lock pthread_mutex_lock
#define scm_i_pthread_mutex_unlock pthread_mutex_unlock
+extern pthread_mutexattr_t scm_i_pthread_mutexattr_recursive[1];
/* Condition variables
*/
diff --git a/libguile/threads.c b/libguile/threads.c
index 329049cfa..af1196a64 100644
--- a/libguile/threads.c
+++ b/libguile/threads.c
@@ -1481,8 +1481,7 @@ scm_i_thread_sleep_for_gc ()
/* This mutex is used by SCM_CRITICAL_SECTION_START/END.
*/
-scm_i_pthread_mutex_t scm_i_critical_section_mutex =
- SCM_I_PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
+scm_i_pthread_mutex_t scm_i_critical_section_mutex;
int scm_i_critical_section_level = 0;
static SCM framed_critical_section_mutex;
@@ -1501,9 +1500,21 @@ scm_frame_critical_section (SCM mutex)
scm_i_pthread_key_t scm_i_freelist, scm_i_freelist2;
scm_i_pthread_mutex_t scm_i_misc_mutex;
+#if SCM_USE_PTHREAD_THREADS
+pthread_mutexattr_t scm_i_pthread_mutexattr_recursive[1];
+#endif
+
void
scm_threads_prehistory (SCM_STACKITEM *base)
{
+#if SCM_USE_PTHREAD_THREADS
+ pthread_mutexattr_init (scm_i_pthread_mutexattr_recursive);
+ pthread_mutexattr_settype (scm_i_pthread_mutexattr_recursive,
+ 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);
scm_i_pthread_key_create (&scm_i_freelist, NULL);