Reverted changed from 2005/01/24 19:14:54, which was a commit to the
[bpt/guile.git] / libguile / futures.c
index 0757186..0f6000a 100644 (file)
@@ -39,7 +39,7 @@ do {                                          \
   list = SCM_FUTURE_NEXT (list);               \
 } while (0)
      
-pthread_mutex_t future_admin_mutex = PTHREAD_MUTEX_INITIALIZER;
+SCM_MUTEX (future_admin_mutex);
 
 static SCM futures = SCM_EOL;
 static SCM young = SCM_EOL;
@@ -99,8 +99,8 @@ static char *s_future = "future";
 static void
 cleanup (scm_t_future *future)
 {
-  pthread_mutex_destroy (&future->mutex);
-  pthread_cond_destroy (&future->cond);
+  scm_mutex_destroy (&future->mutex);
+  scm_cond_destroy (&future->cond);
   scm_gc_free (future, sizeof (*future), s_future);
 #ifdef SCM_FUTURES_DEBUG
   ++n_dead;
@@ -110,18 +110,18 @@ cleanup (scm_t_future *future)
 static SCM
 future_loop (scm_t_future *future)
 {
-  scm_pthread_mutex_lock (&future->mutex);
+  scm_mutex_lock (&future->mutex);
   do {
     if (future->status == SCM_FUTURE_SIGNAL_ME)
-      pthread_cond_broadcast (&future->cond);
+      scm_cond_broadcast (&future->cond);
     future->status = SCM_FUTURE_COMPUTING;
     future->data = (SCM_CLOSUREP (future->data)
                    ? scm_i_call_closure_0 (future->data)
                    : scm_call_0 (future->data));
-    scm_pthread_cond_wait (&future->cond, &future->mutex);
+    scm_cond_wait (&future->cond, &future->mutex);
   } while (!future->die_p);
   future->status = SCM_FUTURE_DEAD;
-  pthread_mutex_unlock (&future->mutex);
+  scm_mutex_unlock (&future->mutex);
   return SCM_UNSPECIFIED;
 }
 
@@ -129,7 +129,7 @@ static SCM
 future_handler (scm_t_future *future, SCM key, SCM args)
 {
   future->status = SCM_FUTURE_DEAD;
-  pthread_mutex_unlock (&future->mutex);
+  scm_mutex_unlock (&future->mutex);
   return scm_apply_1 (*scm_loc_sys_thread_handler, key, args);
 }
 
@@ -139,15 +139,15 @@ alloc_future (SCM thunk)
   scm_t_future *f = scm_gc_malloc (sizeof (*f), s_future);
   SCM future;
   f->data = SCM_BOOL_F;
-  pthread_mutex_init (&f->mutex, NULL);
-  pthread_cond_init (&f->cond, NULL);
+  scm_mutex_init (&f->mutex, &scm_i_plugin_mutex);
+  scm_cond_init (&f->cond, 0);
   f->die_p = 0;
   f->status = SCM_FUTURE_TASK_ASSIGNED;
-  scm_pthread_mutex_lock (&future_admin_mutex);
+  scm_mutex_lock (&future_admin_mutex);
   SCM_NEWSMOB2 (future, scm_tc16_future, futures, f);
   SCM_SET_FUTURE_DATA (future, thunk);
   futures = future;
-  pthread_mutex_unlock (&future_admin_mutex);
+  scm_mutex_unlock (&future_admin_mutex);
   scm_spawn_thread ((scm_t_catch_body) future_loop,
                    SCM_FUTURE (future),
                    (scm_t_catch_handler) future_handler,
@@ -166,7 +166,7 @@ SCM
 scm_i_make_future (SCM thunk)
 {
   SCM future;
-  scm_pthread_mutex_lock (&future_admin_mutex);
+  scm_mutex_lock (&future_admin_mutex);
   while (1)
     {
       if (!scm_is_null (old))
@@ -175,25 +175,25 @@ scm_i_make_future (SCM thunk)
        UNLINK (young, future);
       else
        {
-         pthread_mutex_unlock (&future_admin_mutex);
+         scm_mutex_unlock (&future_admin_mutex);
          return alloc_future (thunk);
        }
-      if (pthread_mutex_trylock (SCM_FUTURE_MUTEX (future)))
+      if (scm_mutex_trylock (SCM_FUTURE_MUTEX (future)))
        kill_future (future);
       else if (!SCM_FUTURE_ALIVE_P (future))
        {
-         pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
+         scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
          cleanup (SCM_FUTURE (future));
        }
       else
        break;
     }
   LINK (futures, future);
-  pthread_mutex_unlock (&future_admin_mutex);
+  scm_mutex_unlock (&future_admin_mutex);
   SCM_SET_FUTURE_DATA (future, thunk);
   SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_TASK_ASSIGNED);
-  pthread_cond_signal (SCM_FUTURE_COND (future));
-  pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
+  scm_cond_signal (SCM_FUTURE_COND (future));
+  scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
   return future;
 }
 
@@ -223,21 +223,20 @@ SCM_DEFINE (scm_future_ref, "future-ref", 1, 0, 0,
 {
   SCM res;
   SCM_VALIDATE_FUTURE (1, future);
-  scm_pthread_mutex_lock (SCM_FUTURE_MUTEX (future));
+  scm_mutex_lock (SCM_FUTURE_MUTEX (future));
   if (SCM_FUTURE_STATUS (future) != SCM_FUTURE_COMPUTING)
     {
       SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_SIGNAL_ME);
-      scm_pthread_cond_wait (SCM_FUTURE_COND (future),
-                            SCM_FUTURE_MUTEX (future));
+      scm_cond_wait (SCM_FUTURE_COND (future), SCM_FUTURE_MUTEX (future));
     }
   if (!SCM_FUTURE_ALIVE_P (future))
     {
-      pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
+      scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
       SCM_MISC_ERROR ("requesting result from failed future ~A",
                      scm_list_1 (future));
     }
   res = SCM_FUTURE_DATA (future);
-  pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
+  scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
   return res;
 }
 #undef FUNC_NAME
@@ -250,7 +249,7 @@ kill_futures (SCM victims)
       SCM future;
       UNLINK (victims, future);
       kill_future (future);
-      pthread_cond_signal (SCM_FUTURE_COND (future));
+      scm_cond_signal (SCM_FUTURE_COND (future));
     }
 }
 
@@ -260,12 +259,12 @@ cleanup_undead ()
   SCM next = undead, *nextloc = &undead;
   while (!scm_is_null (next))
     {
-      if (pthread_mutex_trylock (SCM_FUTURE_MUTEX (next)))
+      if (scm_mutex_trylock (SCM_FUTURE_MUTEX (next)))
        goto next;
       else if (SCM_FUTURE_ALIVE_P (next))
        {
-         pthread_cond_signal (SCM_FUTURE_COND (next));
-         pthread_mutex_unlock (SCM_FUTURE_MUTEX (next));
+         scm_cond_signal (SCM_FUTURE_COND (next));
+         scm_mutex_unlock (SCM_FUTURE_MUTEX (next));
        next:
          SCM_SET_GC_MARK (next);
          nextloc = SCM_FUTURE_NEXTLOC (next);
@@ -275,7 +274,7 @@ cleanup_undead ()
        {
          SCM future;
          UNLINK (next, future);
-         pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
+         scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
          cleanup (SCM_FUTURE (future));
          *nextloc = next;
        }
@@ -342,8 +341,6 @@ scan_futures (void *dummy1, void *dummy2, void *dummy3)
   return 0;
 }
 
-scm_t_bits scm_tc16_future;
-
 void
 scm_init_futures ()
 {