Merge remote-tracking branch 'origin/stable-2.0'
[bpt/guile.git] / libguile / threads.c
index 5a13e5c..463414f 100644 (file)
@@ -63,7 +63,6 @@
 #include "libguile/init.h"
 #include "libguile/scmsigs.h"
 #include "libguile/strings.h"
-#include "libguile/weaks.h"
 
 #include <full-read.h>
 
@@ -398,11 +397,11 @@ thread_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
   else
     id = u.um;
 
-  scm_puts ("#<thread ", port);
+  scm_puts_unlocked ("#<thread ", port);
   scm_uintprint (id, 10, port);
-  scm_puts (" (", port);
+  scm_puts_unlocked (" (", port);
   scm_uintprint ((scm_t_bits)t, 16, port);
-  scm_puts (")>", port);
+  scm_puts_unlocked (")>", port);
   return 1;
 }
 
@@ -661,10 +660,6 @@ do_thread_exit (void *v)
 {
   scm_i_thread *t = (scm_i_thread *) v;
 
-  /* Ensure the signal handling thread has been launched, because we might be
-     shutting it down.  This needs to be done in Guile mode.  */
-  scm_i_ensure_signal_delivery_thread ();
-
   if (!scm_is_false (t->cleanup_handler))
     {
       SCM ptr = t->cleanup_handler;
@@ -685,9 +680,9 @@ do_thread_exit (void *v)
 
   while (!scm_is_null (t->mutexes))
     {
-      SCM mutex = SCM_WEAK_PAIR_CAR (t->mutexes);
+      SCM mutex = scm_c_weak_vector_ref (scm_car (t->mutexes), 0);
 
-      if (!SCM_UNBNDP (mutex))
+      if (scm_is_true (mutex))
        {
          fat_mutex *m  = SCM_MUTEX_DATA (mutex);
 
@@ -701,7 +696,7 @@ do_thread_exit (void *v)
          scm_i_pthread_mutex_unlock (&m->lock);
        }
 
-      t->mutexes = SCM_WEAK_PAIR_CDR (t->mutexes);
+      t->mutexes = scm_cdr (t->mutexes);
     }
 
   scm_i_pthread_mutex_unlock (&t->admin_mutex);
@@ -1308,9 +1303,9 @@ static int
 fat_mutex_print (SCM mx, SCM port, scm_print_state *pstate SCM_UNUSED)
 {
   fat_mutex *m = SCM_MUTEX_DATA (mx);
-  scm_puts ("#<mutex ", port);
+  scm_puts_unlocked ("#<mutex ", port);
   scm_uintprint ((scm_t_bits)m, 16, port);
-  scm_puts (">", port);
+  scm_puts_unlocked (">", port);
   return 1;
 }
 
@@ -1413,7 +1408,8 @@ fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, SCM owner, int *ret)
                 The weak pair itself is eventually removed when MUTEX
                 is unlocked.  Note that `t->mutexes' lists mutexes
                 currently held by T, so it should be small.  */
-             t->mutexes = scm_weak_car_pair (mutex, t->mutexes);
+              t->mutexes = scm_cons (scm_make_weak_vector (SCM_INUM1, mutex),
+                                     t->mutexes);
 
              scm_i_pthread_mutex_unlock (&t->admin_mutex);
            }
@@ -1557,6 +1553,25 @@ typedef struct {
 #define SCM_CONDVARP(x)       SCM_SMOB_PREDICATE (scm_tc16_condvar, x)
 #define SCM_CONDVAR_DATA(x)   ((fat_cond *) SCM_SMOB_DATA (x))
 
+static void
+remove_mutex_from_thread (SCM mutex, scm_i_thread *t)
+{
+  SCM walk, prev;
+  
+  for (prev = SCM_BOOL_F, walk = t->mutexes; scm_is_pair (walk);
+       walk = SCM_CDR (walk))
+    {
+      if (scm_is_eq (mutex, scm_c_weak_vector_ref (SCM_CAR (walk), 0)))
+        {
+          if (scm_is_pair (prev))
+            SCM_SETCDR (prev, SCM_CDR (walk));
+          else
+            t->mutexes = SCM_CDR (walk);
+          break;
+        }
+    }
+}
+
 static int
 fat_mutex_unlock (SCM mutex, SCM cond,
                  const scm_t_timespec *waittime, int relock)
@@ -1601,7 +1616,7 @@ fat_mutex_unlock (SCM mutex, SCM cond,
          if (m->level == 0)
            {
              /* Change the owner of MUTEX.  */
-             t->mutexes = scm_delq_x (mutex, t->mutexes);
+             remove_mutex_from_thread (mutex, t);
              m->owner = unblock_from_queue (m->waiting);
            }
 
@@ -1635,7 +1650,7 @@ fat_mutex_unlock (SCM mutex, SCM cond,
            }
 
          t->block_asyncs--;
-         scm_async_click ();
+         scm_async_tick ();
 
          scm_remember_upto_here_2 (cond, mutex);
 
@@ -1649,7 +1664,7 @@ fat_mutex_unlock (SCM mutex, SCM cond,
       if (m->level == 0)
        {
          /* Change the owner of MUTEX.  */
-         t->mutexes = scm_delq_x (mutex, t->mutexes);
+         remove_mutex_from_thread (mutex, t);
          m->owner = unblock_from_queue (m->waiting);
        }
 
@@ -1745,9 +1760,9 @@ static int
 fat_cond_print (SCM cv, SCM port, scm_print_state *pstate SCM_UNUSED)
 {
   fat_cond *c = SCM_CONDVAR_DATA (cv);
-  scm_puts ("#<condition-variable ", port);
+  scm_puts_unlocked ("#<condition-variable ", port);
   scm_uintprint ((scm_t_bits)c, 16, port);
-  scm_puts (">", port);
+  scm_puts_unlocked (">", port);
   return 1;
 }