feat: various power and thermal optimizations, fix Printers app regression
This commit is contained in:
@@ -443,6 +443,46 @@ namespace Sched {
|
||||
schedLock.Release();
|
||||
}
|
||||
|
||||
bool HasReadyProcesses() {
|
||||
return readyCount > 0;
|
||||
}
|
||||
|
||||
void RunBspMaintenance() {
|
||||
schedLock.Acquire();
|
||||
uint64_t now = Timekeeping::GetTicks();
|
||||
for (int i = 0; i < MaxProcesses; i++) {
|
||||
if (processTable[i].state == ProcessState::Blocked &&
|
||||
processTable[i].sleepUntilTick != 0 &&
|
||||
now >= processTable[i].sleepUntilTick) {
|
||||
processTable[i].sleepUntilTick = 0;
|
||||
processTable[i].waitingForPid = -1;
|
||||
processTable[i].waitingOnObject = nullptr;
|
||||
processTable[i].state = ProcessState::Ready;
|
||||
readyCount++;
|
||||
}
|
||||
}
|
||||
schedLock.Release();
|
||||
|
||||
ReclaimTerminated();
|
||||
}
|
||||
|
||||
uint64_t GetNextDeadlineTick() {
|
||||
uint64_t nextDeadline = 0;
|
||||
|
||||
schedLock.Acquire();
|
||||
for (int i = 0; i < MaxProcesses; i++) {
|
||||
if (processTable[i].state != ProcessState::Blocked) continue;
|
||||
uint64_t deadline = processTable[i].sleepUntilTick;
|
||||
if (deadline == 0) continue;
|
||||
if (nextDeadline == 0 || deadline < nextDeadline) {
|
||||
nextDeadline = deadline;
|
||||
}
|
||||
}
|
||||
schedLock.Release();
|
||||
|
||||
return nextDeadline;
|
||||
}
|
||||
|
||||
void Schedule() {
|
||||
auto* cpu = Smp::GetCurrentCpuData();
|
||||
|
||||
@@ -532,28 +572,12 @@ namespace Sched {
|
||||
schedLock.Release();
|
||||
}
|
||||
|
||||
void Tick() {
|
||||
void Tick(uint32_t elapsedMs) {
|
||||
auto* cpu = Smp::GetCurrentCpuData();
|
||||
|
||||
// BSP: wake sleeping processes and reclaim terminated slots
|
||||
if (cpu->cpuIndex == 0) {
|
||||
schedLock.Acquire();
|
||||
uint64_t now = Timekeeping::GetTicks();
|
||||
for (int i = 0; i < MaxProcesses; i++) {
|
||||
if (processTable[i].state == ProcessState::Blocked &&
|
||||
processTable[i].sleepUntilTick != 0 &&
|
||||
now >= processTable[i].sleepUntilTick) {
|
||||
processTable[i].sleepUntilTick = 0;
|
||||
processTable[i].waitingForPid = -1;
|
||||
processTable[i].waitingOnObject = nullptr;
|
||||
processTable[i].state = ProcessState::Ready;
|
||||
readyCount++;
|
||||
}
|
||||
}
|
||||
schedLock.Release();
|
||||
|
||||
// Reclaim terminated process memory (BSP only, once per tick)
|
||||
ReclaimTerminated();
|
||||
RunBspMaintenance();
|
||||
}
|
||||
|
||||
int slot = cpu->currentSlot;
|
||||
@@ -577,8 +601,10 @@ namespace Sched {
|
||||
return;
|
||||
}
|
||||
|
||||
if (processTable[slot].sliceRemaining > 0) {
|
||||
processTable[slot].sliceRemaining--;
|
||||
if (processTable[slot].sliceRemaining > elapsedMs) {
|
||||
processTable[slot].sliceRemaining -= elapsedMs;
|
||||
} else {
|
||||
processTable[slot].sliceRemaining = 0;
|
||||
}
|
||||
|
||||
if (processTable[slot].sliceRemaining == 0) {
|
||||
|
||||
Reference in New Issue
Block a user