X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/378393581903b274cb7a4d18e0d978071a6b592d..d1ecb069dfe24481e4a83f44cb5217a2b06746d7:/osfmk/kern/thread_act.c diff --git a/osfmk/kern/thread_act.c b/osfmk/kern/thread_act.c index 872fc21dc..8c18ffc30 100644 --- a/osfmk/kern/thread_act.c +++ b/osfmk/kern/thread_act.c @@ -1,23 +1,29 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * 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. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * 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 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * 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. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_FREE_COPYRIGHT@ @@ -46,7 +52,6 @@ #include #include #include -#include #include #include @@ -62,21 +67,40 @@ #include #include #include -#include #include #include #include #include #include #include -#include +#include + #include void act_abort(thread_t); -void act_set_apc(thread_t); void install_special_handler_locked(thread_t); void special_handler_continue(void); +/* + * Internal routine to mark a thread as started. + * Always called with the thread locked. + * + * Note: function intentionally declared with the noinline attribute to + * prevent multiple declaration of probe symbols in this file; we would + * prefer "#pragma noinline", but gcc does not support it. + * PR-6385749 -- the lwp-start probe should fire from within the context + * of the newly created thread. Commented out for now, in case we + * turn it into a dead code probe. + */ +void +thread_start_internal( + thread_t thread) +{ + clear_wait(thread, THREAD_AWAKENED); + thread->started = TRUE; + // DTRACE_PROC1(lwp__start, thread_t, thread); +} + /* * Internal routine to terminate a thread. * Sometimes called with task already locked. @@ -97,13 +121,15 @@ thread_terminate_internal( if (thread->started) clear_wait(thread, THREAD_INTERRUPTED); else { - clear_wait(thread, THREAD_AWAKENED); - thread->started = TRUE; + thread_start_internal(thread); } } else result = KERN_TERMINATED; + if (thread->affinity_set != NULL) + thread_affinity_terminate(thread); + thread_mtx_unlock(thread); if (thread != current_thread() && result == KERN_SUCCESS) @@ -178,8 +204,7 @@ thread_release( if (thread->started) thread_wakeup_one(&thread->suspend_count); else { - clear_wait(thread, THREAD_AWAKENED); - thread->started = TRUE; + thread_start_internal(thread); } } } @@ -233,8 +258,7 @@ thread_resume( if (thread->started) thread_wakeup_one(&thread->suspend_count); else { - clear_wait(thread, THREAD_AWAKENED); - thread->started = TRUE; + thread_start_internal(thread); } } } @@ -290,12 +314,12 @@ act_abort( thread_lock(thread); - if (!(thread->state & TH_ABORT)) { - thread->state |= TH_ABORT; + if (!(thread->sched_mode & TH_MODE_ABORT)) { + thread->sched_mode |= TH_MODE_ABORT; install_special_handler_locked(thread); } else - thread->state &= ~TH_ABORT_SAFELY; + thread->sched_mode &= ~TH_MODE_ABORTSAFELY; thread_unlock(thread); splx(s); @@ -340,9 +364,9 @@ thread_abort_safely( thread_lock(thread); if (!thread->at_safe_point || - clear_wait_internal(thread, THREAD_INTERRUPTED) != KERN_SUCCESS) { - if (!(thread->state & TH_ABORT)) { - thread->state |= (TH_ABORT|TH_ABORT_SAFELY); + clear_wait_internal(thread, THREAD_INTERRUPTED) != KERN_SUCCESS) { + if (!(thread->sched_mode & TH_MODE_ABORT)) { + thread->sched_mode |= TH_MODE_ISABORTED; install_special_handler_locked(thread); } } @@ -550,6 +574,8 @@ thread_dup( if (thread_stop(target)) { thread_mtx_lock(target); result = machine_thread_dup(self, target); + if (self->affinity_set != AFFINITY_SET_NULL) + thread_affinity_dup(self, target); thread_unstop(target); } else { @@ -732,7 +758,6 @@ special_handler_continue(void) thread->sched_pri = DEPRESSPRI; myprocessor->current_pri = thread->sched_pri; - thread->sched_mode &= ~TH_MODE_PREEMPT; } thread_unlock(thread); splx(s); @@ -759,7 +784,7 @@ special_handler( s = splsched(); thread_lock(thread); - thread->state &= ~(TH_ABORT|TH_ABORT_SAFELY); /* clear any aborts */ + thread->sched_mode &= ~TH_MODE_ISABORTED; thread_unlock(thread); splx(s);