* null-threads.h, pthread-threads.h
authorMarius Vollmer <mvo@zagadka.de>
Sun, 23 Oct 2005 20:47:49 +0000 (20:47 +0000)
committerMarius Vollmer <mvo@zagadka.de>
Sun, 23 Oct 2005 20:47:49 +0000 (20:47 +0000)
(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
libguile/null-threads.h
libguile/pthread-threads.h
libguile/threads.c

index e4e617f..3cdf934 100644 (file)
@@ -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);
index 7014d37..a691a68 100644 (file)
 /* 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
  */
index 6550aab..b6a820a 100644 (file)
 /* 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
  */
index 329049c..af1196a 100644 (file)
@@ -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);