--- kern/sched_prim.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/kern/sched_prim.c b/kern/sched_prim.c index be34e7dd..d69e4990 100644 --- a/kern/sched_prim.c +++ b/kern/sched_prim.c @@ -1325,12 +1325,33 @@ void thread_setrun( } else { /* - * Bound, can only run on bound processor. Have to lock - * processor here because it may not be the current one. + * Bound, can only run on bound processor. + * Check two cases, bound is current or not. */ - if (processor->state == PROCESSOR_IDLE) { +#if MACH_HOST + pset = processor->processor_set; +#else + pset = &default_pset; +#endif /* MACH_HOST */ + if (processor == current_processor()) { + if (processor->state == PROCESSOR_IDLE) { + simple_lock(&pset->idle_lock); + if (processor->state == PROCESSOR_IDLE) { + queue_remove(&pset->idle_queue, processor, + processor_t, processor_queue); + pset->idle_count--; + processor->next_thread = th; + processor->state = PROCESSOR_DISPATCHING; + simple_unlock(&pset->idle_lock); + /* Interrupt self */ + cause_ast_check(processor); + return; + } + simple_unlock(&pset->idle_lock); + } + } + else { processor_lock(processor); - pset = processor->processor_set; simple_lock(&pset->idle_lock); if (processor->state == PROCESSOR_IDLE) { queue_remove(&pset->idle_queue, processor, @@ -1340,8 +1361,7 @@ void thread_setrun( processor->state = PROCESSOR_DISPATCHING; simple_unlock(&pset->idle_lock); processor_unlock(processor); - if (processor != current_processor()) - cause_ast_check(processor); + cause_ast_check(processor); return; } simple_unlock(&pset->idle_lock); -- 2.40.1