scheduler: Use precomputed time slice lengths
This commit is contained in:
@@ -579,10 +579,9 @@ reschedule(int32 nextState)
|
|||||||
bigtime_t quantum = nextThreadData->ComputeQuantum();
|
bigtime_t quantum = nextThreadData->ComputeQuantum();
|
||||||
add_timer(quantumTimer, &reschedule_event, quantum,
|
add_timer(quantumTimer, &reschedule_event, quantum,
|
||||||
B_ONE_SHOT_RELATIVE_TIMER);
|
B_ONE_SHOT_RELATIVE_TIMER);
|
||||||
} else {
|
} else
|
||||||
nextThreadData->StartQuantum();
|
|
||||||
gCurrentMode->rebalance_irqs(true);
|
gCurrentMode->rebalance_irqs(true);
|
||||||
}
|
nextThreadData->StartQuantum();
|
||||||
|
|
||||||
modeLocker.Unlock();
|
modeLocker.Unlock();
|
||||||
if (nextThread != oldThread)
|
if (nextThread != oldThread)
|
||||||
@@ -674,6 +673,8 @@ scheduler_set_operation_mode(scheduler_mode mode)
|
|||||||
gCurrentMode = sSchedulerModes[mode];
|
gCurrentMode = sSchedulerModes[mode];
|
||||||
gCurrentMode->switch_to_mode();
|
gCurrentMode->switch_to_mode();
|
||||||
|
|
||||||
|
ThreadData::ComputeQuantumLengths();
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,9 @@
|
|||||||
using namespace Scheduler;
|
using namespace Scheduler;
|
||||||
|
|
||||||
|
|
||||||
|
bigtime_t Scheduler::gQuantumLengths[THREAD_MAX_SET_PRIORITY + 1];
|
||||||
|
|
||||||
|
|
||||||
ThreadData::ThreadData(Thread* thread)
|
ThreadData::ThreadData(Thread* thread)
|
||||||
:
|
:
|
||||||
fThread(thread)
|
fThread(thread)
|
||||||
@@ -116,12 +119,37 @@ ThreadData::ComputeQuantum()
|
|||||||
quantum = std::max(quantum, gCurrentMode->minimal_quantum);
|
quantum = std::max(quantum, gCurrentMode->minimal_quantum);
|
||||||
|
|
||||||
fTimeLeft = quantum;
|
fTimeLeft = quantum;
|
||||||
fQuantumStart = system_time();
|
|
||||||
|
|
||||||
return quantum;
|
return quantum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* static */ void
|
||||||
|
ThreadData::ComputeQuantumLengths()
|
||||||
|
{
|
||||||
|
for (int32 priority = 0; priority <= THREAD_MAX_SET_PRIORITY; priority++) {
|
||||||
|
const bigtime_t kQuantum0 = gCurrentMode->base_quantum;
|
||||||
|
if (priority >= B_URGENT_DISPLAY_PRIORITY) {
|
||||||
|
gQuantumLengths[priority] = kQuantum0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bigtime_t kQuantum1
|
||||||
|
= kQuantum0 * gCurrentMode->quantum_multipliers[0];
|
||||||
|
if (priority > B_NORMAL_PRIORITY) {
|
||||||
|
gQuantumLengths[priority] = _ScaleQuantum(kQuantum1, kQuantum0,
|
||||||
|
B_URGENT_DISPLAY_PRIORITY, B_NORMAL_PRIORITY, priority);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bigtime_t kQuantum2
|
||||||
|
= kQuantum0 * gCurrentMode->quantum_multipliers[1];
|
||||||
|
gQuantumLengths[priority] = _ScaleQuantum(kQuantum2, kQuantum1,
|
||||||
|
B_NORMAL_PRIORITY, B_IDLE_PRIORITY, priority);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ThreadData::_ComputeEffectivePriority() const
|
ThreadData::_ComputeEffectivePriority() const
|
||||||
{
|
{
|
||||||
@@ -181,23 +209,7 @@ ThreadData::_ChooseCPU(CoreEntry* core, bool& rescheduleNeeded) const
|
|||||||
inline bigtime_t
|
inline bigtime_t
|
||||||
ThreadData::_GetBaseQuantum() const
|
ThreadData::_GetBaseQuantum() const
|
||||||
{
|
{
|
||||||
int32 priority = GetEffectivePriority();
|
return gQuantumLengths[GetEffectivePriority()];
|
||||||
|
|
||||||
const bigtime_t kQuantum0 = gCurrentMode->base_quantum;
|
|
||||||
if (priority >= B_URGENT_DISPLAY_PRIORITY)
|
|
||||||
return kQuantum0;
|
|
||||||
|
|
||||||
const bigtime_t kQuantum1
|
|
||||||
= kQuantum0 * gCurrentMode->quantum_multipliers[0];
|
|
||||||
if (priority > B_NORMAL_PRIORITY) {
|
|
||||||
return _ScaleQuantum(kQuantum1, kQuantum0, B_URGENT_DISPLAY_PRIORITY,
|
|
||||||
B_NORMAL_PRIORITY, priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
const bigtime_t kQuantum2
|
|
||||||
= kQuantum0 * gCurrentMode->quantum_multipliers[1];
|
|
||||||
return _ScaleQuantum(kQuantum2, kQuantum1, B_NORMAL_PRIORITY,
|
|
||||||
B_IDLE_PRIORITY, priority);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public:
|
|||||||
inline CoreEntry* Core() const { return fCore; }
|
inline CoreEntry* Core() const { return fCore; }
|
||||||
inline void UnassignCore() { fCore = NULL; }
|
inline void UnassignCore() { fCore = NULL; }
|
||||||
|
|
||||||
|
static void ComputeQuantumLengths();
|
||||||
private:
|
private:
|
||||||
inline int32 _GetPenalty() const;
|
inline int32 _GetPenalty() const;
|
||||||
inline int32 _GetMinimalPriority() const;
|
inline int32 _GetMinimalPriority() const;
|
||||||
@@ -118,6 +119,8 @@ public:
|
|||||||
virtual void operator()(ThreadData* thread) = 0;
|
virtual void operator()(ThreadData* thread) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern bigtime_t gQuantumLengths[THREAD_MAX_SET_PRIORITY + 1];
|
||||||
|
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
ThreadData::HasCacheExpired() const
|
ThreadData::HasCacheExpired() const
|
||||||
|
|||||||
Reference in New Issue
Block a user