From d1138028c9d19fdca5c8e3cebaebd999abafd675 Mon Sep 17 00:00:00 2001 From: Marius Vollmer Date: Sun, 23 Oct 2005 20:47:49 +0000 Subject: [PATCH] * null-threads.h, pthread-threads.h (SCM_I_PTHREAD_RECURSIVE_MUTEX_INITIALIZER): Removed. (scm_i_pthread_mutexattr_recursive): New. * threads.c (scm_i_pthread_mutexattr_recursive): Declare. (scm_i_critical_section_mutex): Do not initialize statically. (scm_threads_prehistory): Initialize scm_i_pthread_mutexattr_recursive and scm_i_critical_section_mutex here. * eval.c (source_mutex): Do not initialiaze statically. (scm_init_eval): Do it here, using scm_i_pthread_mutexattr_recursive. --- libguile/eval.c | 5 ++++- libguile/null-threads.h | 2 +- libguile/pthread-threads.h | 3 +-- libguile/threads.c | 15 +++++++++++++-- 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); -- 2.20.1