mirror of
https://github.com/Atmosphere-NX/Atmosphere-libs.git
synced 2025-08-09 17:09:27 +02:00
Stratosphere: Fix remaining bugs in sm, which now works as a KIP1 on hardware
This commit is contained in:
parent
309a4607dd
commit
0351b32b27
@ -40,14 +40,8 @@ void WaitableManager::process() {
|
|||||||
handles.resize(signalables.size());
|
handles.resize(signalables.size());
|
||||||
std::transform(signalables.begin(), signalables.end(), handles.begin(), [](IWaitable *w) { return w->get_handle(); });
|
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)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
/* Handle a signaled waitable. */
|
/* Handle a signaled waitable. */
|
||||||
/* TODO: What timeout should be passed here? */
|
/* TODO: What timeout should be passed here? */
|
||||||
@ -82,12 +76,19 @@ void WaitableManager::process() {
|
|||||||
delete signalables[handle_index];
|
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++) {
|
for (int i = 0; i < handle_index; i++) {
|
||||||
signalables[i]->update_priority();
|
signalables[i]->update_priority();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do deferred callback for each waitable. */
|
/* 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user