From 0351b32b27b03b1f1dd4612e54ad43a598d27d80 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 30 Apr 2018 22:27:07 -0600 Subject: [PATCH] Stratosphere: Fix remaining bugs in sm, which now works as a KIP1 on hardware --- source/waitablemanager.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/source/waitablemanager.cpp b/source/waitablemanager.cpp index 32db56cf..bc80e27e 100644 --- a/source/waitablemanager.cpp +++ b/source/waitablemanager.cpp @@ -40,14 +40,8 @@ void WaitableManager::process() { handles.resize(signalables.size()); std::transform(signalables.begin(), signalables.end(), handles.begin(), [](IWaitable *w) { return w->get_handle(); }); - unsigned int num_not_deferred = 0; - for (auto & signalable : signalables) { - if (!signalable->get_deferred()) { - num_not_deferred++; - } - } - rc = svcWaitSynchronization(&handle_index, handles.data(), num_not_deferred, this->timeout); + rc = svcWaitSynchronization(&handle_index, handles.data(), signalables.size(), this->timeout); if (R_SUCCEEDED(rc)) { /* Handle a signaled waitable. */ /* TODO: What timeout should be passed here? */ @@ -82,12 +76,19 @@ void WaitableManager::process() { delete signalables[handle_index]; } + /* If relevant, remove from signalables. */ + signalables.erase(std::remove(signalables.begin(), signalables.end(), signalables[handle_index]), signalables.end()); + for (int i = 0; i < handle_index; i++) { signalables[i]->update_priority(); } } /* Do deferred callback for each waitable. */ - std::for_each(signalables.begin() + num_not_deferred, signalables.end(), [](IWaitable *w) { w->handle_deferred(); }); + for (auto & waitable : signalables) { + if (waitable->get_deferred()) { + waitable->handle_deferred(); + } + } } } \ No newline at end of file