summaryrefslogtreecommitdiff
path: root/libguile/futures.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/futures.c')
-rw-r--r--libguile/futures.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/libguile/futures.c b/libguile/futures.c
index 0f6000a7a..075718654 100644
--- a/libguile/futures.c
+++ b/libguile/futures.c
@@ -39,7 +39,7 @@ do { \
list = SCM_FUTURE_NEXT (list); \
} while (0)
-SCM_MUTEX (future_admin_mutex);
+pthread_mutex_t future_admin_mutex = PTHREAD_MUTEX_INITIALIZER;
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)
{
- scm_mutex_destroy (&future->mutex);
- scm_cond_destroy (&future->cond);
+ pthread_mutex_destroy (&future->mutex);
+ pthread_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_mutex_lock (&future->mutex);
+ scm_pthread_mutex_lock (&future->mutex);
do {
if (future->status == SCM_FUTURE_SIGNAL_ME)
- scm_cond_broadcast (&future->cond);
+ pthread_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_cond_wait (&future->cond, &future->mutex);
+ scm_pthread_cond_wait (&future->cond, &future->mutex);
} while (!future->die_p);
future->status = SCM_FUTURE_DEAD;
- scm_mutex_unlock (&future->mutex);
+ pthread_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;
- scm_mutex_unlock (&future->mutex);
+ pthread_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;
- scm_mutex_init (&f->mutex, &scm_i_plugin_mutex);
- scm_cond_init (&f->cond, 0);
+ pthread_mutex_init (&f->mutex, NULL);
+ pthread_cond_init (&f->cond, NULL);
f->die_p = 0;
f->status = SCM_FUTURE_TASK_ASSIGNED;
- scm_mutex_lock (&future_admin_mutex);
+ scm_pthread_mutex_lock (&future_admin_mutex);
SCM_NEWSMOB2 (future, scm_tc16_future, futures, f);
SCM_SET_FUTURE_DATA (future, thunk);
futures = future;
- scm_mutex_unlock (&future_admin_mutex);
+ pthread_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_mutex_lock (&future_admin_mutex);
+ scm_pthread_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
{
- scm_mutex_unlock (&future_admin_mutex);
+ pthread_mutex_unlock (&future_admin_mutex);
return alloc_future (thunk);
}
- if (scm_mutex_trylock (SCM_FUTURE_MUTEX (future)))
+ if (pthread_mutex_trylock (SCM_FUTURE_MUTEX (future)))
kill_future (future);
else if (!SCM_FUTURE_ALIVE_P (future))
{
- scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
cleanup (SCM_FUTURE (future));
}
else
break;
}
LINK (futures, future);
- scm_mutex_unlock (&future_admin_mutex);
+ pthread_mutex_unlock (&future_admin_mutex);
SCM_SET_FUTURE_DATA (future, thunk);
SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_TASK_ASSIGNED);
- scm_cond_signal (SCM_FUTURE_COND (future));
- scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
+ pthread_cond_signal (SCM_FUTURE_COND (future));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
return future;
}
@@ -223,20 +223,21 @@ SCM_DEFINE (scm_future_ref, "future-ref", 1, 0, 0,
{
SCM res;
SCM_VALIDATE_FUTURE (1, future);
- scm_mutex_lock (SCM_FUTURE_MUTEX (future));
+ scm_pthread_mutex_lock (SCM_FUTURE_MUTEX (future));
if (SCM_FUTURE_STATUS (future) != SCM_FUTURE_COMPUTING)
{
SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_SIGNAL_ME);
- scm_cond_wait (SCM_FUTURE_COND (future), SCM_FUTURE_MUTEX (future));
+ scm_pthread_cond_wait (SCM_FUTURE_COND (future),
+ SCM_FUTURE_MUTEX (future));
}
if (!SCM_FUTURE_ALIVE_P (future))
{
- scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
SCM_MISC_ERROR ("requesting result from failed future ~A",
scm_list_1 (future));
}
res = SCM_FUTURE_DATA (future);
- scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
return res;
}
#undef FUNC_NAME
@@ -249,7 +250,7 @@ kill_futures (SCM victims)
SCM future;
UNLINK (victims, future);
kill_future (future);
- scm_cond_signal (SCM_FUTURE_COND (future));
+ pthread_cond_signal (SCM_FUTURE_COND (future));
}
}
@@ -259,12 +260,12 @@ cleanup_undead ()
SCM next = undead, *nextloc = &undead;
while (!scm_is_null (next))
{
- if (scm_mutex_trylock (SCM_FUTURE_MUTEX (next)))
+ if (pthread_mutex_trylock (SCM_FUTURE_MUTEX (next)))
goto next;
else if (SCM_FUTURE_ALIVE_P (next))
{
- scm_cond_signal (SCM_FUTURE_COND (next));
- scm_mutex_unlock (SCM_FUTURE_MUTEX (next));
+ pthread_cond_signal (SCM_FUTURE_COND (next));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (next));
next:
SCM_SET_GC_MARK (next);
nextloc = SCM_FUTURE_NEXTLOC (next);
@@ -274,7 +275,7 @@ cleanup_undead ()
{
SCM future;
UNLINK (next, future);
- scm_mutex_unlock (SCM_FUTURE_MUTEX (future));
+ pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
cleanup (SCM_FUTURE (future));
*nextloc = next;
}
@@ -341,6 +342,8 @@ scan_futures (void *dummy1, void *dummy2, void *dummy3)
return 0;
}
+scm_t_bits scm_tc16_future;
+
void
scm_init_futures ()
{