/* * Reset thread to default state in preparation for termination * Called with thread mutex locked * * Always called on current thread, so we don't need a run queue remove */ void thread_policy_reset( thread_t thread) { spl_t s; assert(thread == current_thread()); s = splsched(); thread_lock(thread); assert_thread_sched_count(thread); if (thread->sched_flags & TH_SFLAG_FAILSAFE) sched_thread_mode_undemote(thread, TH_SFLAG_FAILSAFE); assert_thread_sched_count(thread); if (thread->sched_flags & TH_SFLAG_THROTTLED) sched_set_thread_throttled(thread, FALSE); assert_thread_sched_count(thread); assert(thread->BG_COUNT == 0); /* At this point, the various demotions should be inactive */ assert(!(thread->sched_flags & TH_SFLAG_DEMOTED_MASK)); assert(!(thread->sched_flags & TH_SFLAG_THROTTLED)); assert(!(thread->sched_flags & TH_SFLAG_DEPRESSED_MASK)); /* Reset thread back to task-default basepri and mode */ sched_mode_t newmode = SCHED(initial_thread_sched_mode)(thread->task); sched_set_thread_mode(thread, newmode); thread->importance = 0; sched_set_thread_base_priority(thread, thread->task_priority); /* Prevent further changes to thread base priority or mode */ thread->policy_reset = 1; assert(thread->BG_COUNT == 0); assert_thread_sched_count(thread); thread_unlock(thread); splx(s); }
/* * Set the thread's requested mode * Called with thread mutex and thread locked */ static void thread_set_user_sched_mode(thread_t thread, sched_mode_t mode) { if (thread->policy_reset) return; /* * TODO: Instead of having saved mode, have 'user mode' and 'true mode'. * That way there's zero confusion over which the user wants * and which the kernel wants. */ if (thread->sched_flags & TH_SFLAG_DEMOTED_MASK) thread->saved_mode = mode; else sched_set_thread_mode(thread, mode); }
/* * Set the thread's requested mode and recompute priority * Called with thread mutex and thread locked * * TODO: Mitigate potential problems caused by moving thread to end of runq * whenever its priority is recomputed * Only remove when it actually changes? Attempt to re-insert at appropriate location? */ static void thread_set_user_sched_mode_and_recompute_pri(thread_t thread, sched_mode_t mode) { if (thread->policy_reset) return; boolean_t removed = thread_run_queue_remove(thread); /* * TODO: Instead of having saved mode, have 'user mode' and 'true mode'. * That way there's zero confusion over which the user wants * and which the kernel wants. */ if (thread->sched_flags & TH_SFLAG_DEMOTED_MASK) thread->saved_mode = mode; else sched_set_thread_mode(thread, mode); thread_recompute_priority(thread); if (removed) thread_run_queue_reinsert(thread, SCHED_TAILQ); }