aboutsummaryrefslogtreecommitdiff
path: root/boehm-gc/quick_threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'boehm-gc/quick_threads.c')
-rw-r--r--boehm-gc/quick_threads.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/boehm-gc/quick_threads.c b/boehm-gc/quick_threads.c
new file mode 100644
index 00000000000..adc26da6d59
--- /dev/null
+++ b/boehm-gc/quick_threads.c
@@ -0,0 +1,55 @@
+/*
+ * Support code for cooperative coop/quick threads.
+ * Copyright (c) 1998, 1999 Cygnus Solutions.
+ */
+
+#include "boehm-config.h"
+
+#ifdef QUICK_THREADS
+
+#include "gc_priv.h"
+
+#include "coop.h"
+
+void GC_push_all_stacks (void)
+{
+ coop_t *t;
+ ptr_t lo, hi;
+
+ t = coop_first_thread ();
+
+ if (t == NULL)
+ {
+ /* Threads haven't started, so mark the real stack. */
+#ifdef STACK_GROWS_DOWN
+ GC_push_all_stack( GC_approx_sp(), GC_stackbottom );
+#else
+ GC_push_all_stack( GC_stackbottom, GC_approx_sp() );
+#endif
+ }
+ else
+ {
+ for ( ; t != NULL; t = coop_next_thread (t))
+ {
+ if (t == coop_global_curr)
+ lo = GC_approx_sp ();
+ else
+ {
+ lo = t->top;
+ /* LO can be NULL when the new thread has not yet been
+ used. */
+ if (! lo)
+ continue;
+ }
+ hi = t->base;
+
+#ifdef STACK_GROWS_DOWN
+ GC_push_all_stack (lo, hi);
+#else
+ GC_push_all_stack (hi, lo);
+#endif
+ }
+ }
+}
+
+#endif /* QUICK_THREADS */