From 45e73d324aeb507c49f37e5da2194941c79ec8a2 Mon Sep 17 00:00:00 2001 From: psucien Date: Fri, 17 May 2024 23:32:15 +0200 Subject: [PATCH] kernel: event queue improvements --- src/core/libraries/kernel/event_queue.cpp | 27 +++++++++++++---------- src/core/libraries/kernel/libkernel.cpp | 2 ++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/core/libraries/kernel/event_queue.cpp b/src/core/libraries/kernel/event_queue.cpp index 023811da..9243609d 100644 --- a/src/core/libraries/kernel/event_queue.cpp +++ b/src/core/libraries/kernel/event_queue.cpp @@ -12,7 +12,6 @@ EqueueInternal::~EqueueInternal() = default; int EqueueInternal::addEvent(const EqueueEvent& event) { std::scoped_lock lock{m_mutex}; - ASSERT(m_events.empty()); ASSERT(!event.isTriggered); // TODO check if event is already exists and return it. Currently we just add in m_events array @@ -21,6 +20,8 @@ int EqueueInternal::addEvent(const EqueueEvent& event) { } int EqueueInternal::removeEvent(u64 id) { + std::scoped_lock lock{m_mutex}; + const auto& event_q = std::ranges::find_if(m_events, [id](auto& ev) { return ev.event.ident == id; }); ASSERT(event_q != m_events.cend()); @@ -51,12 +52,15 @@ int EqueueInternal::waitForEvents(SceKernelEvent* ev, int num, u32 micros) { } bool EqueueInternal::triggerEvent(u64 ident, s16 filter, void* trigger_data) { - std::scoped_lock lock{m_mutex}; + { + std::scoped_lock lock{m_mutex}; - ASSERT(m_events.size() <= 1); - - auto& event = m_events[0]; - event.trigger(trigger_data); + for (auto& event : m_events) { + if (event.event.ident == ident) { // event filter? + event.trigger(trigger_data); + } + } + } m_cond.notify_one(); return true; @@ -65,12 +69,11 @@ bool EqueueInternal::triggerEvent(u64 ident, s16 filter, void* trigger_data) { int EqueueInternal::getTriggeredEvents(SceKernelEvent* ev, int num) { int ret = 0; - ASSERT(m_events.size() <= 1); - auto& event = m_events[0]; - - if (event.isTriggered) { - ev[ret++] = event.event; - event.reset(); + for (auto& event : m_events) { + if (event.isTriggered) { + ev[ret++] = event.event; + event.reset(); + } } return ret; diff --git a/src/core/libraries/kernel/libkernel.cpp b/src/core/libraries/kernel/libkernel.cpp index ee7f7ef4..3aced046 100644 --- a/src/core/libraries/kernel/libkernel.cpp +++ b/src/core/libraries/kernel/libkernel.cpp @@ -196,6 +196,8 @@ void LibKernel_Register(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("D0OdFMjp46I", "libkernel", 1, "libkernel", 1, 1, sceKernelCreateEqueue); LIB_FUNCTION("jpFjmgAC5AE", "libkernel", 1, "libkernel", 1, 1, sceKernelDeleteEqueue); LIB_FUNCTION("fzyMKs9kim0", "libkernel", 1, "libkernel", 1, 1, sceKernelWaitEqueue); + LIB_FUNCTION("vz+pg2zdopI", "libkernel", 1, "libkernel", 1, 1, sceKernelGetEventUserData); + LIB_FUNCTION("4R6-OvI2cEA", "libkernel", 1, "libkernel", 1, 1, sceKernelAddUserEvent); // misc LIB_FUNCTION("WslcK1FQcGI", "libkernel", 1, "libkernel", 1, 1, sceKernelIsNeoMode); LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail);