shadPS4/src/core/libraries/kernel/event_queue.cpp

72 lines
1.7 KiB
C++
Raw Normal View History

2024-02-23 22:32:32 +01:00
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/assert.h"
2023-11-05 12:41:10 +01:00
#include "common/debug.h"
2024-04-13 23:35:48 +02:00
#include "core/libraries/kernel/event_queue.h"
2023-11-06 00:11:54 +01:00
2024-04-13 23:35:48 +02:00
namespace Libraries::Kernel {
2023-11-06 00:11:54 +01:00
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
m_events.push_back(event);
return 0;
}
int EqueueInternal::waitForEvents(SceKernelEvent* ev, int num, u32 micros) {
std::unique_lock lock{m_mutex};
int ret = 0;
const auto predicate = [&] {
ret = getTriggeredEvents(ev, num);
return ret > 0;
};
char buf[128];
pthread_getname_np(pthread_self(), buf, 128);
fmt::print("Thread {} waiting for events (micros = {})\n", buf, micros);
if (micros == 0) {
m_cond.wait(lock, predicate);
} else {
m_cond.wait_for(lock, std::chrono::microseconds(micros), predicate);
}
fmt::print("Wait done\n");
return ret;
}
2023-09-11 12:14:13 +02:00
bool EqueueInternal::triggerEvent(u64 ident, s16 filter, void* trigger_data) {
std::scoped_lock lock{m_mutex};
2023-09-11 12:14:13 +02:00
ASSERT(m_events.size() <= 1);
2023-09-11 12:14:13 +02:00
auto& event = m_events[0];
event.trigger(trigger_data);
m_cond.notify_one();
2023-09-11 12:14:13 +02:00
return true;
}
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();
}
return ret;
}
2024-04-13 23:35:48 +02:00
} // namespace Libraries::Kernel