From 2d52abbd5d279c622982b8cae1f38d51bf73c2d2 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 31 Dec 2013 00:59:29 +0100 Subject: [PATCH] scheduler: Inherit penalty and core from creator thread --- src/system/kernel/scheduler/low_latency.cpp | 3 ++- src/system/kernel/scheduler/power_saving.cpp | 2 ++ .../kernel/scheduler/scheduler_thread.cpp | 22 ++++++++++++++++--- .../kernel/scheduler/scheduler_thread.h | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/scheduler/low_latency.cpp b/src/system/kernel/scheduler/low_latency.cpp index 1e0c79d267..42baee3325 100644 --- a/src/system/kernel/scheduler/low_latency.cpp +++ b/src/system/kernel/scheduler/low_latency.cpp @@ -35,7 +35,8 @@ static bool has_cache_expired(const ThreadData* threadData) { SCHEDULER_ENTER_FUNCTION(); - + if (threadData->WentSleepActive() == 0) + return false; CoreEntry* core = threadData->Core(); bigtime_t activeTime = core->GetActiveTime(); return activeTime - threadData->WentSleepActive() > kCacheExpire; diff --git a/src/system/kernel/scheduler/power_saving.cpp b/src/system/kernel/scheduler/power_saving.cpp index 4239fd150b..3b36add0c9 100644 --- a/src/system/kernel/scheduler/power_saving.cpp +++ b/src/system/kernel/scheduler/power_saving.cpp @@ -41,6 +41,8 @@ static bool has_cache_expired(const ThreadData* threadData) { SCHEDULER_ENTER_FUNCTION(); + if (threadData->WentSleep() == 0) + return false; return system_time() - threadData->WentSleep() > kCacheExpire; } diff --git a/src/system/kernel/scheduler/scheduler_thread.cpp b/src/system/kernel/scheduler/scheduler_thread.cpp index 4db6516a04..9f5d834d0b 100644 --- a/src/system/kernel/scheduler/scheduler_thread.cpp +++ b/src/system/kernel/scheduler/scheduler_thread.cpp @@ -16,14 +16,12 @@ ThreadData::ThreadData(Thread* thread) : fThread(thread) { - Init(); } void ThreadData::Init() { - fPriorityPenalty = 0; fAdditionalPenalty = 0; fEffectivePriority = -1; @@ -40,7 +38,25 @@ ThreadData::Init() fEnqueued = false; - fCore = NULL; + Thread* currentThread = thread_get_current_thread(); + ASSERT(currentThread != NULL); + if (!thread_is_idle_thread(currentThread)) { + ThreadData* currentThreadData = currentThread->scheduler_data; + int32 penalty = currentThreadData->fPriorityPenalty; + + int32 minimalPriority = _GetMinimalPriority(); + if (fThread->priority - penalty >= minimalPriority) + fPriorityPenalty = penalty; + else + fPriorityPenalty = fThread->priority - minimalPriority; + + fCore = currentThreadData->fCore; + } else { + fPriorityPenalty = 0; + fAdditionalPenalty = 0; + + fCore = NULL; + } } diff --git a/src/system/kernel/scheduler/scheduler_thread.h b/src/system/kernel/scheduler/scheduler_thread.h index d37d8bf5b2..98cc660cc6 100644 --- a/src/system/kernel/scheduler/scheduler_thread.h +++ b/src/system/kernel/scheduler/scheduler_thread.h @@ -195,7 +195,7 @@ ThreadData::ShouldCancelPenalty() const { SCHEDULER_ENTER_FUNCTION(); - if (fCore == NULL) + if (fCore == NULL || fWentSleep == 0) return false; return fCore->StarvationCounter() != fWentSleepCount