X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d7e50217d7adf6e52786a38bcaa4cd698cb9a79e..5eebf7385fedb1517b66b53c28e5aa6bb0a2be50:/bsd/kern/kern_synch.c diff --git a/bsd/kern/kern_synch.c b/bsd/kern/kern_synch.c index 06f1d4591..97b35818c 100644 --- a/bsd/kern/kern_synch.c +++ b/bsd/kern/kern_synch.c @@ -3,22 +3,19 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -61,21 +58,16 @@ static void _sleep_continue(void) { register struct proc *p; - register thread_t thread = current_thread(); - thread_act_t th_act; + register thread_t self = current_act(); struct uthread * ut; int sig, catch; int error = 0; - th_act = current_act(); - ut = get_bsdthread_info(th_act); + ut = get_bsdthread_info(self); catch = ut->uu_pri & PCATCH; p = current_proc(); -#if FIXME /* [ */ - thread->wait_mesg = NULL; -#endif /* FIXME ] */ - switch (get_thread_waitresult(thread)) { + switch (get_thread_waitresult(self)) { case THREAD_TIMED_OUT: error = EWOULDBLOCK; break; @@ -90,7 +82,7 @@ _sleep_continue(void) /* else fall through */ case THREAD_INTERRUPTED: if (catch) { - if (thread_should_abort(current_thread())) { + if (thread_should_abort(self)) { error = EINTR; } else if (SHOULDissignal(p,ut)) { if (sig = CURSIG(p)) { @@ -99,7 +91,7 @@ _sleep_continue(void) else error = ERESTART; } - if (thread_should_abort(current_thread())) { + if (thread_should_abort(self)) { error = EINTR; } } @@ -109,7 +101,7 @@ _sleep_continue(void) } if (error == EINTR || error == ERESTART) - act_set_astbsd(th_act); + act_set_astbsd(self); if (ut->uu_timo) thread_cancel_timer(); @@ -145,8 +137,7 @@ _sleep( int (*continuation)(int)) { register struct proc *p; - register thread_t thread = current_thread(); - thread_act_t th_act; + register thread_t self = current_act(); struct uthread * ut; int sig, catch = pri & PCATCH; int sigttblock = pri & PTTYBLOCK; @@ -156,8 +147,7 @@ _sleep( s = splhigh(); - th_act = current_act(); - ut = get_bsdthread_info(th_act); + ut = get_bsdthread_info(self); p = current_proc(); #if KTRACE @@ -166,11 +156,11 @@ _sleep( #endif p->p_priority = pri & PRIMASK; - if (chan) - wait_result = assert_wait(chan, - (catch) ? THREAD_ABORTSAFE : THREAD_UNINT); - - if (abstime) + if (chan != NULL) + assert_wait_prim(chan, NULL, abstime, + (catch) ? THREAD_ABORTSAFE : THREAD_UNINT); + else + if (abstime != 0) thread_set_timer_deadline(abstime); /* @@ -185,7 +175,8 @@ _sleep( if (catch) { if (SHOULDissignal(p,ut)) { if (sig = CURSIG(p)) { - clear_wait(thread, THREAD_INTERRUPTED); + if (clear_wait(self, THREAD_INTERRUPTED) == KERN_FAILURE) + goto block; /* if SIGTTOU or SIGTTIN then block till SIGCONT */ if (sigttblock && ((sig == SIGTTOU) || (sig == SIGTTIN))) { p->p_flag |= P_TTYSLEEP; @@ -206,24 +197,24 @@ _sleep( goto out; } } - if (thread_should_abort(current_thread())) { - clear_wait(thread, THREAD_INTERRUPTED); + if (thread_should_abort(self)) { + if (clear_wait(self, THREAD_INTERRUPTED) == KERN_FAILURE) + goto block; error = EINTR; goto out; } - if (get_thread_waitresult(thread) != THREAD_WAITING) { + if (get_thread_waitresult(self) != THREAD_WAITING) { /*already happened */ goto out; } } -#if FIXME /* [ */ - thread->wait_mesg = wmsg; -#endif /* FIXME ] */ +block: + splx(s); p->p_stats->p_ru.ru_nvcsw++; - if (continuation != THREAD_CONTINUE_NULL ) { + if ((thread_continue_t)continuation != THREAD_CONTINUE_NULL ) { ut->uu_continuation = continuation; ut->uu_pri = pri; ut->uu_timo = abstime? 1: 0; @@ -233,9 +224,6 @@ _sleep( wait_result = thread_block(THREAD_CONTINUE_NULL); -#if FIXME /* [ */ - thread->wait_mesg = NULL; -#endif /* FIXME ] */ switch (wait_result) { case THREAD_TIMED_OUT: error = EWOULDBLOCK; @@ -251,7 +239,7 @@ _sleep( /* else fall through */ case THREAD_INTERRUPTED: if (catch) { - if (thread_should_abort(current_thread())) { + if (thread_should_abort(self)) { error = EINTR; } else if (SHOULDissignal(p,ut)) { if (sig = CURSIG(p)) { @@ -260,7 +248,7 @@ _sleep( else error = ERESTART; } - if (thread_should_abort(current_thread())) { + if (thread_should_abort(self)) { error = EINTR; } } @@ -270,7 +258,7 @@ _sleep( } out: if (error == EINTR || error == ERESTART) - act_set_astbsd(th_act); + act_set_astbsd(self); if (abstime) thread_cancel_timer(); (void) splx(s);