(#.(sb!vm:fixnumize 2) :suspended)
(#.(sb!vm:fixnumize 3) :dead))))
-(defun %set-thread-state (thread state)
- (setf (sb!sys:sap-ref-sap (thread-%sap thread)
- (* sb!vm::thread-state-slot
- sb!vm::n-word-bytes))
- (sb!sys:int-sap
- (ecase state
- (:starting #.(sb!vm:fixnumize 0))
- (:running #.(sb!vm:fixnumize 1))
- (:suspended #.(sb!vm:fixnumize 2))
- (:dead #.(sb!vm:fixnumize 3))))))
-
(defun thread-alive-p (thread)
#!+sb-doc
"Check if THREAD is running."
;; we're going down, can't handle
;; interrupts sanely anymore
(sb!unix::block-blockable-signals)))))
- ;; mark the thread dead, so that the gc does not
- ;; wait for it to handle sig-stop-for-gc
- (%set-thread-state thread :dead)
;; and remove what can be the last reference to
;; the thread object
(handle-thread-exit thread)
sigemptyset(&ss); sigaddset(&ss,SIG_STOP_FOR_GC);
sigwaitinfo(&ss,0);
- if(thread->state!=STATE_SUSPENDED) {
+ if(thread->state!=STATE_RUNNING) {
lose("sig_stop_for_gc_handler: wrong thread state on wakeup: %ld\n",
fixnum_value(thread->state));
}
- thread->state=STATE_RUNNING;
undo_fake_foreign_function_call(context);
}
new_thread_trampoline(struct thread *th)
{
lispobj function;
+ int result;
function = th->unbound_marker;
th->unbound_marker = UNBOUND_MARKER_WIDETAG;
if(arch_os_thread_init(th)==0) return 1;
while(th->os_thread<1) sched_yield();
th->state=STATE_RUNNING;
- return funcall0(function);
+ result = funcall0(function);
+ th->state=STATE_DEAD;
+ return result;
}
#endif /* LISP_FEATURE_SB_THREAD */
if((p==th) || (p->state==STATE_SUSPENDED) ||
(p->state==STATE_DEAD)) {
p=p->next;
+ } else {
+ sched_yield();
}
}
FSHOW_SIGNAL((stderr,"/gc_stop_the_world:end\n"));
}
FSHOW_SIGNAL((stderr, "/gc_start_the_world: resuming %lu\n",
p->os_thread));
+ p->state=STATE_RUNNING;
thread_kill(p->os_thread,SIG_STOP_FOR_GC);
}
}
- /* we must wait for all threads to leave suspended state else we
- * risk signal accumulation and lose any meaning of
- * thread->state */
- for(p=all_threads;p;) {
- if((p==th) || (p->state!=STATE_SUSPENDED)) {
- p=p->next;
- }
- }
release_spinlock(&all_threads_lock);
FSHOW_SIGNAL((stderr,"/gc_start_the_world:end\n"));
}
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.3.34"
+"0.9.3.35"