kern_return_t thread_abort_safely( thread_act_t act) { thread_t thread; kern_return_t ret; spl_t s; if ( act == THR_ACT_NULL ) return (KERN_INVALID_ARGUMENT); thread = act_lock_thread(act); if (!act->active) { act_unlock_thread(act); return (KERN_TERMINATED); } s = splsched(); 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); install_special_handler_locked(act); } } thread_unlock(thread); splx(s); act_unlock_thread(act); return (KERN_SUCCESS); }
kern_return_t thread_abort_safely( thread_t thread) { kern_return_t result = KERN_SUCCESS; if (thread == THREAD_NULL) return (KERN_INVALID_ARGUMENT); thread_mtx_lock(thread); if (thread->active) { spl_t s = splsched(); thread_lock(thread); if (!thread->at_safe_point || clear_wait_internal(thread, THREAD_INTERRUPTED) != KERN_SUCCESS) { if (!(thread->sched_flags & TH_SFLAG_ABORT)) { thread->sched_flags |= TH_SFLAG_ABORTED_MASK; install_special_handler_locked(thread); } } thread_unlock(thread); splx(s); } else result = KERN_TERMINATED; thread_mtx_unlock(thread); return (result); }
/* * install_special_handler: * * Install the special returnhandler that handles suspension and * termination, if it hasn't been installed already. * * Called with the thread mutex held. */ void install_special_handler( thread_t thread) { spl_t s = splsched(); thread_lock(thread); install_special_handler_locked(thread); thread_unlock(thread); splx(s); }
/* * Indicate that the activation should run its * special handler to detect a condition. * * Called with thread mutex held. */ void act_abort( thread_t thread) { spl_t s = splsched(); thread_lock(thread); if (!(thread->sched_flags & TH_SFLAG_ABORT)) { thread->sched_flags |= TH_SFLAG_ABORT; install_special_handler_locked(thread); } else thread->sched_flags &= ~TH_SFLAG_ABORTSAFELY; thread_unlock(thread); splx(s); }
/* * Indicate that the activation should run its * special handler to detect the condition. * * Called with act_lock held. */ kern_return_t act_abort( thread_act_t act, boolean_t chain_break ) { thread_t thread = act->thread; spl_t s = splsched(); assert(thread->top_act == act); thread_lock(thread); if (!(thread->state & TH_ABORT)) { thread->state |= TH_ABORT; install_special_handler_locked(act); } else { thread->state &= ~TH_ABORT_SAFELY; } thread_unlock(thread); splx(s); return (KERN_SUCCESS); }