mirror of
https://github.com/mikage-emu/mikage-dev.git
synced 2025-02-02 10:28:22 +01:00
OS: Optimize thread timeout checking
This commit is contained in:
parent
b094815ecb
commit
7d2c663901
2 changed files with 15 additions and 6 deletions
|
@ -2290,6 +2290,7 @@ SVCEmptyFuture OS::SVCSleepThread(Thread& source, int64_t duration) {
|
||||||
source.status = Thread::Status::WaitingForTimeout;
|
source.status = Thread::Status::WaitingForTimeout;
|
||||||
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
|
waiting_queue.push_back(source.GetPointer());
|
||||||
|
|
||||||
return MakeFuture(nullptr);
|
return MakeFuture(nullptr);
|
||||||
}
|
}
|
||||||
|
@ -2737,6 +2738,9 @@ break;
|
||||||
source.status = Thread::Status::WaitingForArbitration;
|
source.status = Thread::Status::WaitingForArbitration;
|
||||||
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
|
if (source.timeout_at != -1) {
|
||||||
|
waiting_queue.push_back(source.GetPointer());
|
||||||
|
}
|
||||||
|
|
||||||
Reschedule(source.GetPointer());
|
Reschedule(source.GetPointer());
|
||||||
}
|
}
|
||||||
|
@ -2946,6 +2950,9 @@ SVCFuture<PromisedResult,PromisedWakeIndex> OS::SVCWaitSynchronizationN(Thread&
|
||||||
source.status = Thread::Status::Sleeping;
|
source.status = Thread::Status::Sleeping;
|
||||||
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
ready_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
// priority_queue.remove_if([ptr=source.GetPointer()](auto elem) { return elem.lock() == ptr; });
|
||||||
|
if (source.timeout_at != -1) {
|
||||||
|
waiting_queue.push_back(source.GetPointer());
|
||||||
|
}
|
||||||
source.GetLogger()->info("{}Putting thread into sleep state...", ThreadPrinter{source});
|
source.GetLogger()->info("{}Putting thread into sleep state...", ThreadPrinter{source});
|
||||||
Reschedule(source.GetPointer());
|
Reschedule(source.GetPointer());
|
||||||
} else {
|
} else {
|
||||||
|
@ -5779,12 +5786,9 @@ void OS::ElapseTime(std::chrono::nanoseconds time) {
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// TODO NOW: This should also be checked for threads waiting for arbitration or events with timeout!!!
|
// TODO NOW: This should also be checked for threads waiting for arbitration or events with timeout!!!
|
||||||
for (auto thread_weak : threads) {
|
for (auto thread_it = waiting_queue.begin(); thread_it != waiting_queue.end();) {
|
||||||
// TODO: This looks really expensive... Should just keep a list of threads waiting for timeout
|
auto thread = thread_it->lock();
|
||||||
auto thread = thread_weak.lock();
|
if (thread->timeout_at <= GetTimeInNanoSeconds()) {
|
||||||
if (thread &&
|
|
||||||
(thread->status == Thread::Status::WaitingForTimeout || thread->status == Thread::Status::Sleeping) &&
|
|
||||||
thread->timeout_at != -1 && thread->timeout_at <= GetTimeInNanoSeconds()) {
|
|
||||||
thread->GetLogger()->info("{}Waking up thread after timeout", ThreadPrinter{*thread});
|
thread->GetLogger()->info("{}Waking up thread after timeout", ThreadPrinter{*thread});
|
||||||
|
|
||||||
// status==Sleeping corresponds to WaitSynchronizationN timing out... TODO: This is extremely ugly, clean this up instead :/
|
// status==Sleeping corresponds to WaitSynchronizationN timing out... TODO: This is extremely ugly, clean this up instead :/
|
||||||
|
@ -5801,6 +5805,9 @@ void OS::ElapseTime(std::chrono::nanoseconds time) {
|
||||||
thread->status = Thread::Status::Ready;
|
thread->status = Thread::Status::Ready;
|
||||||
ready_queue.push_back(thread);
|
ready_queue.push_back(thread);
|
||||||
// priority_queue.push_back(thread);
|
// priority_queue.push_back(thread);
|
||||||
|
thread_it = waiting_queue.erase(thread_it);
|
||||||
|
} else {
|
||||||
|
++thread_it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6002,6 +6009,7 @@ void OS::StartScheduler(boost::coroutines::symmetric_coroutine<void>::yield_type
|
||||||
if (next_thread->status == Thread::Status::WaitingForTimeout &&
|
if (next_thread->status == Thread::Status::WaitingForTimeout &&
|
||||||
next_thread->timeout_at <= GetTimeInNanoSeconds()) {
|
next_thread->timeout_at <= GetTimeInNanoSeconds()) {
|
||||||
next_thread->status = Thread::Status::Ready;
|
next_thread->status = Thread::Status::Ready;
|
||||||
|
waiting_queue.erase(std::remove_if(waiting_queue.begin(), waiting_queue.end(), [&next_thread](auto& elem) { return elem.lock() == next_thread; }));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next_thread->status == Thread::Status::Ready) {
|
if (next_thread->status == Thread::Status::Ready) {
|
||||||
|
|
|
@ -1550,6 +1550,7 @@ public: // TODO: Ugh.
|
||||||
public: // TODO: privatize this again!
|
public: // TODO: privatize this again!
|
||||||
std::list<std::weak_ptr<Thread>> ready_queue; // Queue of threads that are ready to run
|
std::list<std::weak_ptr<Thread>> ready_queue; // Queue of threads that are ready to run
|
||||||
// std::list<std::weak_ptr<Thread>> priority_queue; // Queue of threads that are ready to run and should be prioritized over those in ready_queue (e.g. because they had been waiting on an event that was just signalled)
|
// std::list<std::weak_ptr<Thread>> priority_queue; // Queue of threads that are ready to run and should be prioritized over those in ready_queue (e.g. because they had been waiting on an event that was just signalled)
|
||||||
|
std::vector<std::weak_ptr<Thread>> waiting_queue; // List of threads waiting on a timeout
|
||||||
|
|
||||||
std::shared_ptr<MemoryBlockOwner> internal_memory_owner;
|
std::shared_ptr<MemoryBlockOwner> internal_memory_owner;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue