summaryrefslogtreecommitdiff
path: root/libguile/futures.c
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>2003-01-23 20:31:38 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>2003-01-23 20:31:38 +0000
commit361d631fb7353c575b0ca05f26fec21eb91a8679 (patch)
treea59b8044f6c9c37077e06bf6c039e0484798b959 /libguile/futures.c
parent6b468ba449cbd2db62f62e4b6f8bb584b4dff96e (diff)
downloadguile-361d631fb7353c575b0ca05f26fec21eb91a8679.tar.gz
* futures.c (mark_futures): Don't need to mark data of recycled
futures. (scan_futures, cleanup_undead): Be smarter about marking futures---avoid unnecessary passes through future lists.
Diffstat (limited to 'libguile/futures.c')
-rw-r--r--libguile/futures.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libguile/futures.c b/libguile/futures.c
index fefd93121..826eacd3b 100644
--- a/libguile/futures.c
+++ b/libguile/futures.c
@@ -290,6 +290,7 @@ cleanup_undead ()
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);
next = *nextloc;
}
@@ -309,7 +310,6 @@ mark_futures (SCM futures)
{
while (!SCM_NULLP (futures))
{
- scm_gc_mark (SCM_FUTURE_DATA (futures));
SCM_SET_GC_MARK (futures);
futures = SCM_FUTURE_NEXT (futures);
}
@@ -329,6 +329,8 @@ scan_futures (void *dummy1, void *dummy2, void *dummy3)
young = SCM_EOL;
last_switch = now;
}
+ else
+ mark_futures (young);
next = futures;
nextloc = &futures;
@@ -352,15 +354,14 @@ scan_futures (void *dummy1, void *dummy2, void *dummy3)
{
SCM future;
UNLINK (next, future);
+ SCM_SET_GC_MARK (future);
LINK (young, future);
}
}
*nextloc = SCM_EOL;
exit:
cleanup_undead ();
- mark_futures (young);
mark_futures (old);
- mark_futures (undead);
return 0;
}