| /* |
| * 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 */ |