- if(tail!=all_threads) {
- /* new threads always get consed onto the front of all_threads,
- * and may be created by any thread that we haven't signalled
- * yet or hasn't received our signal and stopped yet. So, check
- * for them on each time around */
- for(p=all_threads;p!=tail;p=p->next) {
- if(p==th) continue;
- /* if the head of all_threads is removed during
- * gc_stop_the_world, we may take a second trip through the
- * list and end up counting twice as many threads to wait for
- * as actually exist */
- if(p->state!=STATE_RUNNING) continue;
- countdown_to_gc++;
- p->state=STATE_STOPPING;
- /* Note no return value check from kill(). If the
- * thread had been reaped already, we kill it and
- * increment countdown_to_gc anyway. This is to avoid
- * complicating the logic in destroy_thread, which would
- * otherwise have to know whether the thread died before or
- * after it was killed
- */
- kill(p->pid,SIG_STOP_FOR_GC);
- }
- tail=all_threads;
- } else {
- finished=(countdown_to_gc==0);
+ for(p=all_threads,old_pid=p->pid; p; p=p->next) {
+ if(p==th) continue;
+ if(p->state!=STATE_RUNNING) continue;
+ p->state=STATE_STOPPING;
+ kill(p->pid,SIG_STOP_FOR_GC);