Author: bonefish Date: 2011-05-31 00:37:46 +0200 (Tue, 31 May 2011) New Revision: 41847 Changeset: https://dev.haiku-os.org/changeset/41847 Modified: haiku/branches/developer/bonefish/signals/headers/private/kernel/kscheduler.h haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_affine.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple.cpp haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple_smp.cpp Log: Moved function context_switch(), which was duplicated in all scheduler implementations, to scheduler.cpp and renamed it to scheduler_switch_thread(). Modified: haiku/branches/developer/bonefish/signals/headers/private/kernel/kscheduler.h =================================================================== --- haiku/branches/developer/bonefish/signals/headers/private/kernel/kscheduler.h 2011-05-30 22:31:59 UTC (rev 41846) +++ haiku/branches/developer/bonefish/signals/headers/private/kernel/kscheduler.h 2011-05-30 22:37:46 UTC (rev 41847) @@ -89,6 +89,8 @@ extern "C" { #endif +void scheduler_switch_thread(Thread* fromThread, Thread* toThread); + void scheduler_add_listener(struct SchedulerListener* listener); void scheduler_remove_listener(struct SchedulerListener* listener); Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler.cpp 2011-05-30 22:31:59 UTC (rev 41846) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler.cpp 2011-05-30 22:37:46 UTC (rev 41847) @@ -31,7 +31,7 @@ } -// #pragma mark - +// #pragma mark - SchedulerListener SchedulerListener::~SchedulerListener() @@ -39,6 +39,38 @@ } +// #pragma mark - kernel private + + +/*! Switches the currently running thread. + This is a service function for scheduler implementations. + + \param fromThread The currently running thread. + \param toThread The thread to switch to. Must be different from + \a fromThread. +*/ +void +scheduler_switch_thread(Thread* fromThread, Thread* toThread) +{ + if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) + user_debug_thread_unscheduled(fromThread); + + cpu_ent* cpu = fromThread->cpu; + toThread->previous_cpu = toThread->cpu = cpu; + fromThread->cpu = NULL; + cpu->running_thread = toThread; + + arch_thread_set_current_thread(toThread); + arch_thread_context_switch(fromThread, toThread); + + // Looks weird, but is correct. fromThread had been unscheduled earlier, + // but is back now. The notification for a thread scheduled the first time + // happens in thread.cpp:thread_kthread_entry(). + if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) + user_debug_thread_scheduled(fromThread); +} + + /*! Add the given scheduler listener. Thread lock must be held. */ void Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_affine.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_affine.cpp 2011-05-30 22:31:59 UTC (rev 41846) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_affine.cpp 2011-05-30 22:37:46 UTC (rev 41847) @@ -339,28 +339,6 @@ } -static void -context_switch(Thread *fromThread, Thread *toThread) -{ - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_unscheduled(fromThread); - - cpu_ent* cpu = fromThread->cpu; - toThread->previous_cpu = toThread->cpu = cpu; - fromThread->cpu = NULL; - cpu->running_thread = toThread; - - arch_thread_set_current_thread(toThread); - arch_thread_context_switch(fromThread, toThread); - - // Looks weird, but is correct. fromThread had been unscheduled earlier, - // but is back now. The notification for a thread scheduled the first time - // happens in thread.cpp:thread_kthread_entry(). - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_scheduled(fromThread); -} - - static int32 reschedule_event(timer *unused) { @@ -528,7 +506,7 @@ B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) - context_switch(oldThread, nextThread); + scheduler_switch_thread(oldThread, nextThread); } } Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple.cpp 2011-05-30 22:31:59 UTC (rev 41846) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple.cpp 2011-05-30 22:37:46 UTC (rev 41847) @@ -179,28 +179,6 @@ } -static void -context_switch(Thread *fromThread, Thread *toThread) -{ - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_unscheduled(fromThread); - - cpu_ent* cpu = fromThread->cpu; - toThread->previous_cpu = toThread->cpu = cpu; - fromThread->cpu = NULL; - cpu->running_thread = toThread; - - arch_thread_set_current_thread(toThread); - arch_thread_context_switch(fromThread, toThread); - - // Looks weird, but is correct. fromThread had been unscheduled earlier, - // but is back now. The notification for a thread scheduled the first time - // happens in thread.cpp:thread_kthread_entry(). - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_scheduled(fromThread); -} - - static int32 reschedule_event(timer *unused) { @@ -352,7 +330,7 @@ B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) - context_switch(oldThread, nextThread); + scheduler_switch_thread(oldThread, nextThread); } } Modified: haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple_smp.cpp =================================================================== --- haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple_smp.cpp 2011-05-30 22:31:59 UTC (rev 41846) +++ haiku/branches/developer/bonefish/signals/src/system/kernel/scheduler/scheduler_simple_smp.cpp 2011-05-30 22:37:46 UTC (rev 41847) @@ -244,28 +244,6 @@ } -static void -context_switch(Thread *fromThread, Thread *toThread) -{ - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_unscheduled(fromThread); - - cpu_ent* cpu = fromThread->cpu; - toThread->previous_cpu = toThread->cpu = cpu; - fromThread->cpu = NULL; - cpu->running_thread = toThread; - - arch_thread_set_current_thread(toThread); - arch_thread_context_switch(fromThread, toThread); - - // Looks weird, but is correct. fromThread had been unscheduled earlier, - // but is back now. The notification for a thread scheduled the first time - // happens in thread.cpp:thread_kthread_entry(). - if ((fromThread->flags & THREAD_FLAGS_DEBUGGER_INSTALLED) != 0) - user_debug_thread_scheduled(fromThread); -} - - static int32 reschedule_event(timer *unused) { @@ -451,7 +429,7 @@ B_ONE_SHOT_RELATIVE_TIMER | B_TIMER_ACQUIRE_SCHEDULER_LOCK); if (nextThread != oldThread) - context_switch(oldThread, nextThread); + scheduler_switch_thread(oldThread, nextThread); } }