From 4133b7f7992a38b19d5bfe47591e932e92d958e8 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 23 Dec 2012 14:59:54 +0100 Subject: Make thread_suspend wait for !TH_UNINT 0a55db5 made thread_suspend return KERN_FAILURE when the target thread is in TH_UNINT state. That however is not currently handled by libc, and it's more useful to just wait for the thread to get interruptible. * kern/sched_prim.c (thread_invoke): Wake NEW_THREAD->STATE for thread_suspend. * kern/thread.c (thread_suspend): Wait on NEW_THREAD->STATE as long as THREAD has TH_UNINT. --- kern/thread.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'kern/thread.c') diff --git a/kern/thread.c b/kern/thread.c index d279bc82..87be9231 100644 --- a/kern/thread.c +++ b/kern/thread.c @@ -1326,10 +1326,12 @@ kern_return_t thread_suspend( hold = FALSE; spl = splsched(); thread_lock(thread); - if (thread->state & TH_UNINT) { + /* Wait for thread to get interruptible */ + while (thread->state & TH_UNINT) { + assert_wait(&thread->state, TRUE); thread_unlock(thread); - (void) splx(spl); - return KERN_FAILURE; + thread_block(NULL); + thread_lock(thread); } if (thread->user_stop_count++ == 0) { hold = TRUE; -- cgit v1.2.3