diff options
| author | 2018-12-03 17:05:57 -0500 | |
|---|---|---|
| committer | 2018-12-03 17:05:57 -0500 | |
| commit | ef69b4b83050967732e6e977396111289c9e86ba (patch) | |
| tree | 0f0908b21f5cec9dca4d2269cd724cfca81848db /src/core | |
| parent | Merge pull request #1833 from lioncash/clean (diff) | |
| parent | hle_ipc: Refactor SleepClientThread to avoid ReadableEvent (diff) | |
| download | yuzu-ef69b4b83050967732e6e977396111289c9e86ba.tar.gz yuzu-ef69b4b83050967732e6e977396111289c9e86ba.tar.xz yuzu-ef69b4b83050967732e6e977396111289c9e86ba.zip | |
Merge pull request #1803 from DarkLordZach/k-able-event
kernel: Divide Event into ReadableEvent and WritableEvent
Diffstat (limited to 'src/core')
33 files changed, 397 insertions, 236 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e1f21a764..73aec8ab0 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -97,8 +97,6 @@ add_library(core STATIC | |||
| 97 | hle/kernel/client_session.cpp | 97 | hle/kernel/client_session.cpp |
| 98 | hle/kernel/client_session.h | 98 | hle/kernel/client_session.h |
| 99 | hle/kernel/errors.h | 99 | hle/kernel/errors.h |
| 100 | hle/kernel/event.cpp | ||
| 101 | hle/kernel/event.h | ||
| 102 | hle/kernel/handle_table.cpp | 100 | hle/kernel/handle_table.cpp |
| 103 | hle/kernel/handle_table.h | 101 | hle/kernel/handle_table.h |
| 104 | hle/kernel/hle_ipc.cpp | 102 | hle/kernel/hle_ipc.cpp |
| @@ -111,6 +109,8 @@ add_library(core STATIC | |||
| 111 | hle/kernel/object.h | 109 | hle/kernel/object.h |
| 112 | hle/kernel/process.cpp | 110 | hle/kernel/process.cpp |
| 113 | hle/kernel/process.h | 111 | hle/kernel/process.h |
| 112 | hle/kernel/readable_event.cpp | ||
| 113 | hle/kernel/readable_event.h | ||
| 114 | hle/kernel/resource_limit.cpp | 114 | hle/kernel/resource_limit.cpp |
| 115 | hle/kernel/resource_limit.h | 115 | hle/kernel/resource_limit.h |
| 116 | hle/kernel/scheduler.cpp | 116 | hle/kernel/scheduler.cpp |
| @@ -133,6 +133,8 @@ add_library(core STATIC | |||
| 133 | hle/kernel/vm_manager.h | 133 | hle/kernel/vm_manager.h |
| 134 | hle/kernel/wait_object.cpp | 134 | hle/kernel/wait_object.cpp |
| 135 | hle/kernel/wait_object.h | 135 | hle/kernel/wait_object.h |
| 136 | hle/kernel/writable_event.cpp | ||
| 137 | hle/kernel/writable_event.h | ||
| 136 | hle/lock.cpp | 138 | hle/lock.cpp |
| 137 | hle/lock.h | 139 | hle/lock.h |
| 138 | hle/result.h | 140 | hle/result.h |
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 68d5376cb..61ce7d7e4 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -15,13 +15,14 @@ | |||
| 15 | #include "common/logging/log.h" | 15 | #include "common/logging/log.h" |
| 16 | #include "core/core.h" | 16 | #include "core/core.h" |
| 17 | #include "core/hle/ipc_helpers.h" | 17 | #include "core/hle/ipc_helpers.h" |
| 18 | #include "core/hle/kernel/event.h" | ||
| 19 | #include "core/hle/kernel/handle_table.h" | 18 | #include "core/hle/kernel/handle_table.h" |
| 20 | #include "core/hle/kernel/hle_ipc.h" | 19 | #include "core/hle/kernel/hle_ipc.h" |
| 21 | #include "core/hle/kernel/kernel.h" | 20 | #include "core/hle/kernel/kernel.h" |
| 22 | #include "core/hle/kernel/object.h" | 21 | #include "core/hle/kernel/object.h" |
| 23 | #include "core/hle/kernel/process.h" | 22 | #include "core/hle/kernel/process.h" |
| 23 | #include "core/hle/kernel/readable_event.h" | ||
| 24 | #include "core/hle/kernel/server_session.h" | 24 | #include "core/hle/kernel/server_session.h" |
| 25 | #include "core/hle/kernel/writable_event.h" | ||
| 25 | #include "core/memory.h" | 26 | #include "core/memory.h" |
| 26 | 27 | ||
| 27 | namespace Kernel { | 28 | namespace Kernel { |
| @@ -36,11 +37,9 @@ void SessionRequestHandler::ClientDisconnected(const SharedPtr<ServerSession>& s | |||
| 36 | boost::range::remove_erase(connected_sessions, server_session); | 37 | boost::range::remove_erase(connected_sessions, server_session); |
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | SharedPtr<Event> HLERequestContext::SleepClientThread(SharedPtr<Thread> thread, | 40 | SharedPtr<WritableEvent> HLERequestContext::SleepClientThread( |
| 40 | const std::string& reason, u64 timeout, | 41 | SharedPtr<Thread> thread, const std::string& reason, u64 timeout, WakeupCallback&& callback, |
| 41 | WakeupCallback&& callback, | 42 | SharedPtr<WritableEvent> writable_event) { |
| 42 | Kernel::SharedPtr<Kernel::Event> event) { | ||
| 43 | |||
| 44 | // Put the client thread to sleep until the wait event is signaled or the timeout expires. | 43 | // Put the client thread to sleep until the wait event is signaled or the timeout expires. |
| 45 | thread->SetWakeupCallback([context = *this, callback]( | 44 | thread->SetWakeupCallback([context = *this, callback]( |
| 46 | ThreadWakeupReason reason, SharedPtr<Thread> thread, | 45 | ThreadWakeupReason reason, SharedPtr<Thread> thread, |
| @@ -51,23 +50,25 @@ SharedPtr<Event> HLERequestContext::SleepClientThread(SharedPtr<Thread> thread, | |||
| 51 | return true; | 50 | return true; |
| 52 | }); | 51 | }); |
| 53 | 52 | ||
| 54 | if (!event) { | 53 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 54 | if (!writable_event) { | ||
| 55 | // Create event if not provided | 55 | // Create event if not provided |
| 56 | auto& kernel = Core::System::GetInstance().Kernel(); | 56 | const auto pair = WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 57 | event = | 57 | "HLE Pause Event: " + reason); |
| 58 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "HLE Pause Event: " + reason); | 58 | writable_event = pair.writable; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | event->Clear(); | 61 | const auto readable_event{writable_event->GetReadableEvent()}; |
| 62 | writable_event->Clear(); | ||
| 62 | thread->SetStatus(ThreadStatus::WaitHLEEvent); | 63 | thread->SetStatus(ThreadStatus::WaitHLEEvent); |
| 63 | thread->SetWaitObjects({event}); | 64 | thread->SetWaitObjects({readable_event}); |
| 64 | event->AddWaitingThread(thread); | 65 | readable_event->AddWaitingThread(thread); |
| 65 | 66 | ||
| 66 | if (timeout > 0) { | 67 | if (timeout > 0) { |
| 67 | thread->WakeAfterDelay(timeout); | 68 | thread->WakeAfterDelay(timeout); |
| 68 | } | 69 | } |
| 69 | 70 | ||
| 70 | return event; | 71 | return writable_event; |
| 71 | } | 72 | } |
| 72 | 73 | ||
| 73 | HLERequestContext::HLERequestContext(SharedPtr<Kernel::ServerSession> server_session) | 74 | HLERequestContext::HLERequestContext(SharedPtr<Kernel::ServerSession> server_session) |
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index a38e34b74..e5c0610cd 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h | |||
| @@ -24,10 +24,11 @@ class ServiceFrameworkBase; | |||
| 24 | namespace Kernel { | 24 | namespace Kernel { |
| 25 | 25 | ||
| 26 | class Domain; | 26 | class Domain; |
| 27 | class Event; | ||
| 28 | class HandleTable; | 27 | class HandleTable; |
| 29 | class HLERequestContext; | 28 | class HLERequestContext; |
| 30 | class Process; | 29 | class Process; |
| 30 | class ReadableEvent; | ||
| 31 | class WritableEvent; | ||
| 31 | 32 | ||
| 32 | /** | 33 | /** |
| 33 | * Interface implemented by HLE Session handlers. | 34 | * Interface implemented by HLE Session handlers. |
| @@ -119,12 +120,13 @@ public: | |||
| 119 | * @param callback Callback to be invoked when the thread is resumed. This callback must write | 120 | * @param callback Callback to be invoked when the thread is resumed. This callback must write |
| 120 | * the entire command response once again, regardless of the state of it before this function | 121 | * the entire command response once again, regardless of the state of it before this function |
| 121 | * was called. | 122 | * was called. |
| 122 | * @param event Event to use to wake up the thread. If unspecified, an event will be created. | 123 | * @param writable_event Event to use to wake up the thread. If unspecified, an event will be |
| 124 | * created. | ||
| 123 | * @returns Event that when signaled will resume the thread and call the callback function. | 125 | * @returns Event that when signaled will resume the thread and call the callback function. |
| 124 | */ | 126 | */ |
| 125 | SharedPtr<Event> SleepClientThread(SharedPtr<Thread> thread, const std::string& reason, | 127 | SharedPtr<WritableEvent> SleepClientThread(SharedPtr<Thread> thread, const std::string& reason, |
| 126 | u64 timeout, WakeupCallback&& callback, | 128 | u64 timeout, WakeupCallback&& callback, |
| 127 | Kernel::SharedPtr<Kernel::Event> event = nullptr); | 129 | SharedPtr<WritableEvent> writable_event = nullptr); |
| 128 | 130 | ||
| 129 | /// Populates this context with data from the requesting process/thread. | 131 | /// Populates this context with data from the requesting process/thread. |
| 130 | ResultCode PopulateFromIncomingCommandBuffer(const HandleTable& handle_table, | 132 | ResultCode PopulateFromIncomingCommandBuffer(const HandleTable& handle_table, |
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index c9f4d0bb3..69082ce3e 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h | |||
| @@ -33,9 +33,9 @@ enum class HandleType : u32 { | |||
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | enum class ResetType { | 35 | enum class ResetType { |
| 36 | OneShot, | 36 | OneShot, ///< Reset automatically on object acquisition |
| 37 | Sticky, | 37 | Sticky, ///< Never reset automatically |
| 38 | Pulse, | 38 | Pulse, ///< Reset automatically on wakeup |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | class Object : NonCopyable { | 41 | class Object : NonCopyable { |
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/readable_event.cpp index 8967e602e..92e16b4e6 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/readable_event.cpp | |||
| @@ -4,46 +4,37 @@ | |||
| 4 | 4 | ||
| 5 | #include <algorithm> | 5 | #include <algorithm> |
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "core/hle/kernel/event.h" | ||
| 8 | #include "core/hle/kernel/object.h" | 7 | #include "core/hle/kernel/object.h" |
| 8 | #include "core/hle/kernel/readable_event.h" | ||
| 9 | #include "core/hle/kernel/thread.h" | 9 | #include "core/hle/kernel/thread.h" |
| 10 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | 11 | ||
| 11 | namespace Kernel { | 12 | namespace Kernel { |
| 12 | 13 | ||
| 13 | Event::Event(KernelCore& kernel) : WaitObject{kernel} {} | 14 | ReadableEvent::ReadableEvent(KernelCore& kernel) : WaitObject{kernel} {} |
| 14 | Event::~Event() = default; | 15 | ReadableEvent::~ReadableEvent() = default; |
| 15 | 16 | ||
| 16 | SharedPtr<Event> Event::Create(KernelCore& kernel, ResetType reset_type, std::string name) { | 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { |
| 17 | SharedPtr<Event> evt(new Event(kernel)); | ||
| 18 | |||
| 19 | evt->signaled = false; | ||
| 20 | evt->reset_type = reset_type; | ||
| 21 | evt->name = std::move(name); | ||
| 22 | |||
| 23 | return evt; | ||
| 24 | } | ||
| 25 | |||
| 26 | bool Event::ShouldWait(Thread* thread) const { | ||
| 27 | return !signaled; | 18 | return !signaled; |
| 28 | } | 19 | } |
| 29 | 20 | ||
| 30 | void Event::Acquire(Thread* thread) { | 21 | void ReadableEvent::Acquire(Thread* thread) { |
| 31 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); |
| 32 | 23 | ||
| 33 | if (reset_type == ResetType::OneShot) | 24 | if (reset_type == ResetType::OneShot) |
| 34 | signaled = false; | 25 | signaled = false; |
| 35 | } | 26 | } |
| 36 | 27 | ||
| 37 | void Event::Signal() { | 28 | void ReadableEvent::Signal() { |
| 38 | signaled = true; | 29 | signaled = true; |
| 39 | WakeupAllWaitingThreads(); | 30 | WakeupAllWaitingThreads(); |
| 40 | } | 31 | } |
| 41 | 32 | ||
| 42 | void Event::Clear() { | 33 | void ReadableEvent::Clear() { |
| 43 | signaled = false; | 34 | signaled = false; |
| 44 | } | 35 | } |
| 45 | 36 | ||
| 46 | void Event::WakeupAllWaitingThreads() { | 37 | void ReadableEvent::WakeupAllWaitingThreads() { |
| 47 | WaitObject::WakeupAllWaitingThreads(); | 38 | WaitObject::WakeupAllWaitingThreads(); |
| 48 | 39 | ||
| 49 | if (reset_type == ResetType::Pulse) | 40 | if (reset_type == ResetType::Pulse) |
diff --git a/src/core/hle/kernel/readable_event.h b/src/core/hle/kernel/readable_event.h new file mode 100644 index 000000000..b1f1f4871 --- /dev/null +++ b/src/core/hle/kernel/readable_event.h | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "core/hle/kernel/object.h" | ||
| 8 | #include "core/hle/kernel/wait_object.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class KernelCore; | ||
| 13 | class WritableEvent; | ||
| 14 | |||
| 15 | class ReadableEvent final : public WaitObject { | ||
| 16 | friend class WritableEvent; | ||
| 17 | |||
| 18 | public: | ||
| 19 | ~ReadableEvent() override; | ||
| 20 | |||
| 21 | std::string GetTypeName() const override { | ||
| 22 | return "ReadableEvent"; | ||
| 23 | } | ||
| 24 | std::string GetName() const override { | ||
| 25 | return name; | ||
| 26 | } | ||
| 27 | |||
| 28 | ResetType GetResetType() const { | ||
| 29 | return reset_type; | ||
| 30 | } | ||
| 31 | |||
| 32 | static const HandleType HANDLE_TYPE = HandleType::Event; | ||
| 33 | HandleType GetHandleType() const override { | ||
| 34 | return HANDLE_TYPE; | ||
| 35 | } | ||
| 36 | |||
| 37 | bool ShouldWait(Thread* thread) const override; | ||
| 38 | void Acquire(Thread* thread) override; | ||
| 39 | |||
| 40 | void WakeupAllWaitingThreads() override; | ||
| 41 | |||
| 42 | void Clear(); | ||
| 43 | |||
| 44 | private: | ||
| 45 | explicit ReadableEvent(KernelCore& kernel); | ||
| 46 | |||
| 47 | void Signal(); | ||
| 48 | |||
| 49 | ResetType reset_type; | ||
| 50 | bool signaled; | ||
| 51 | |||
| 52 | std::string name; ///< Name of event (optional) | ||
| 53 | }; | ||
| 54 | |||
| 55 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 3339777c1..051b09d00 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -20,17 +20,18 @@ | |||
| 20 | #include "core/hle/kernel/address_arbiter.h" | 20 | #include "core/hle/kernel/address_arbiter.h" |
| 21 | #include "core/hle/kernel/client_port.h" | 21 | #include "core/hle/kernel/client_port.h" |
| 22 | #include "core/hle/kernel/client_session.h" | 22 | #include "core/hle/kernel/client_session.h" |
| 23 | #include "core/hle/kernel/event.h" | ||
| 24 | #include "core/hle/kernel/handle_table.h" | 23 | #include "core/hle/kernel/handle_table.h" |
| 25 | #include "core/hle/kernel/kernel.h" | 24 | #include "core/hle/kernel/kernel.h" |
| 26 | #include "core/hle/kernel/mutex.h" | 25 | #include "core/hle/kernel/mutex.h" |
| 27 | #include "core/hle/kernel/process.h" | 26 | #include "core/hle/kernel/process.h" |
| 27 | #include "core/hle/kernel/readable_event.h" | ||
| 28 | #include "core/hle/kernel/resource_limit.h" | 28 | #include "core/hle/kernel/resource_limit.h" |
| 29 | #include "core/hle/kernel/scheduler.h" | 29 | #include "core/hle/kernel/scheduler.h" |
| 30 | #include "core/hle/kernel/shared_memory.h" | 30 | #include "core/hle/kernel/shared_memory.h" |
| 31 | #include "core/hle/kernel/svc.h" | 31 | #include "core/hle/kernel/svc.h" |
| 32 | #include "core/hle/kernel/svc_wrap.h" | 32 | #include "core/hle/kernel/svc_wrap.h" |
| 33 | #include "core/hle/kernel/thread.h" | 33 | #include "core/hle/kernel/thread.h" |
| 34 | #include "core/hle/kernel/writable_event.h" | ||
| 34 | #include "core/hle/lock.h" | 35 | #include "core/hle/lock.h" |
| 35 | #include "core/hle/result.h" | 36 | #include "core/hle/result.h" |
| 36 | #include "core/hle/service/service.h" | 37 | #include "core/hle/service/service.h" |
| @@ -1361,7 +1362,7 @@ static ResultCode ResetSignal(Handle handle) { | |||
| 1361 | LOG_DEBUG(Kernel_SVC, "called handle 0x{:08X}", handle); | 1362 | LOG_DEBUG(Kernel_SVC, "called handle 0x{:08X}", handle); |
| 1362 | 1363 | ||
| 1363 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); | 1364 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); |
| 1364 | auto event = handle_table.Get<Event>(handle); | 1365 | auto event = handle_table.Get<ReadableEvent>(handle); |
| 1365 | 1366 | ||
| 1366 | ASSERT(event != nullptr); | 1367 | ASSERT(event != nullptr); |
| 1367 | 1368 | ||
| @@ -1524,7 +1525,7 @@ static ResultCode ClearEvent(Handle handle) { | |||
| 1524 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); | 1525 | LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); |
| 1525 | 1526 | ||
| 1526 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); | 1527 | const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); |
| 1527 | SharedPtr<Event> evt = handle_table.Get<Event>(handle); | 1528 | SharedPtr<ReadableEvent> evt = handle_table.Get<ReadableEvent>(handle); |
| 1528 | if (evt == nullptr) { | 1529 | if (evt == nullptr) { |
| 1529 | LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle); | 1530 | LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle); |
| 1530 | return ERR_INVALID_HANDLE; | 1531 | return ERR_INVALID_HANDLE; |
diff --git a/src/core/hle/kernel/writable_event.cpp b/src/core/hle/kernel/writable_event.cpp new file mode 100644 index 000000000..a58ea6ec8 --- /dev/null +++ b/src/core/hle/kernel/writable_event.cpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <algorithm> | ||
| 6 | #include "common/assert.h" | ||
| 7 | #include "core/hle/kernel/kernel.h" | ||
| 8 | #include "core/hle/kernel/object.h" | ||
| 9 | #include "core/hle/kernel/readable_event.h" | ||
| 10 | #include "core/hle/kernel/thread.h" | ||
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 12 | |||
| 13 | namespace Kernel { | ||
| 14 | |||
| 15 | WritableEvent::WritableEvent(KernelCore& kernel) : Object{kernel} {} | ||
| 16 | WritableEvent::~WritableEvent() = default; | ||
| 17 | |||
| 18 | EventPair WritableEvent::CreateEventPair(KernelCore& kernel, ResetType reset_type, | ||
| 19 | std::string name) { | ||
| 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); | ||
| 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); | ||
| 22 | |||
| 23 | writable_event->name = name + ":Writable"; | ||
| 24 | writable_event->readable = readable_event; | ||
| 25 | readable_event->name = name + ":Readable"; | ||
| 26 | readable_event->signaled = false; | ||
| 27 | readable_event->reset_type = reset_type; | ||
| 28 | |||
| 29 | return {std::move(readable_event), std::move(writable_event)}; | ||
| 30 | } | ||
| 31 | |||
| 32 | SharedPtr<ReadableEvent> WritableEvent::GetReadableEvent() const { | ||
| 33 | return readable; | ||
| 34 | } | ||
| 35 | |||
| 36 | ResetType WritableEvent::GetResetType() const { | ||
| 37 | return readable->reset_type; | ||
| 38 | } | ||
| 39 | |||
| 40 | void WritableEvent::Signal() { | ||
| 41 | readable->Signal(); | ||
| 42 | } | ||
| 43 | |||
| 44 | void WritableEvent::Clear() { | ||
| 45 | readable->Clear(); | ||
| 46 | } | ||
| 47 | |||
| 48 | bool WritableEvent::IsSignaled() const { | ||
| 49 | return readable->signaled; | ||
| 50 | } | ||
| 51 | |||
| 52 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/writable_event.h index 27d6126b0..fc57d18d7 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/writable_event.h | |||
| @@ -11,20 +11,29 @@ | |||
| 11 | namespace Kernel { | 11 | namespace Kernel { |
| 12 | 12 | ||
| 13 | class KernelCore; | 13 | class KernelCore; |
| 14 | class ReadableEvent; | ||
| 15 | class WritableEvent; | ||
| 14 | 16 | ||
| 15 | class Event final : public WaitObject { | 17 | struct EventPair { |
| 18 | SharedPtr<ReadableEvent> readable; | ||
| 19 | SharedPtr<WritableEvent> writable; | ||
| 20 | }; | ||
| 21 | |||
| 22 | class WritableEvent final : public Object { | ||
| 16 | public: | 23 | public: |
| 24 | ~WritableEvent() override; | ||
| 25 | |||
| 17 | /** | 26 | /** |
| 18 | * Creates an event | 27 | * Creates an event |
| 19 | * @param kernel The kernel instance to create this event under. | 28 | * @param kernel The kernel instance to create this event under. |
| 20 | * @param reset_type ResetType describing how to create event | 29 | * @param reset_type ResetType describing how to create event |
| 21 | * @param name Optional name of event | 30 | * @param name Optional name of event |
| 22 | */ | 31 | */ |
| 23 | static SharedPtr<Event> Create(KernelCore& kernel, ResetType reset_type, | 32 | static EventPair CreateEventPair(KernelCore& kernel, ResetType reset_type, |
| 24 | std::string name = "Unknown"); | 33 | std::string name = "Unknown"); |
| 25 | 34 | ||
| 26 | std::string GetTypeName() const override { | 35 | std::string GetTypeName() const override { |
| 27 | return "Event"; | 36 | return "WritableEvent"; |
| 28 | } | 37 | } |
| 29 | std::string GetName() const override { | 38 | std::string GetName() const override { |
| 30 | return name; | 39 | return name; |
| @@ -35,25 +44,19 @@ public: | |||
| 35 | return HANDLE_TYPE; | 44 | return HANDLE_TYPE; |
| 36 | } | 45 | } |
| 37 | 46 | ||
| 38 | ResetType GetResetType() const { | 47 | SharedPtr<ReadableEvent> GetReadableEvent() const; |
| 39 | return reset_type; | ||
| 40 | } | ||
| 41 | |||
| 42 | bool ShouldWait(Thread* thread) const override; | ||
| 43 | void Acquire(Thread* thread) override; | ||
| 44 | 48 | ||
| 45 | void WakeupAllWaitingThreads() override; | 49 | ResetType GetResetType() const; |
| 46 | 50 | ||
| 47 | void Signal(); | 51 | void Signal(); |
| 48 | void Clear(); | 52 | void Clear(); |
| 53 | bool IsSignaled() const; | ||
| 49 | 54 | ||
| 50 | private: | 55 | private: |
| 51 | explicit Event(KernelCore& kernel); | 56 | explicit WritableEvent(KernelCore& kernel); |
| 52 | ~Event() override; | ||
| 53 | 57 | ||
| 54 | ResetType reset_type; ///< Current ResetType | 58 | SharedPtr<ReadableEvent> readable; |
| 55 | 59 | ||
| 56 | bool signaled; ///< Whether the event has already been signaled | ||
| 57 | std::string name; ///< Name of event (optional) | 60 | std::string name; ///< Name of event (optional) |
| 58 | }; | 61 | }; |
| 59 | 62 | ||
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index d595c37b0..3a7b6da84 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -9,9 +9,11 @@ | |||
| 9 | #include "audio_core/audio_renderer.h" | 9 | #include "audio_core/audio_renderer.h" |
| 10 | #include "core/core.h" | 10 | #include "core/core.h" |
| 11 | #include "core/hle/ipc_helpers.h" | 11 | #include "core/hle/ipc_helpers.h" |
| 12 | #include "core/hle/kernel/event.h" | 12 | #include "core/hle/kernel/kernel.h" |
| 13 | #include "core/hle/kernel/process.h" | 13 | #include "core/hle/kernel/process.h" |
| 14 | #include "core/hle/kernel/readable_event.h" | ||
| 14 | #include "core/hle/kernel/shared_memory.h" | 15 | #include "core/hle/kernel/shared_memory.h" |
| 16 | #include "core/hle/kernel/writable_event.h" | ||
| 15 | #include "core/hle/service/acc/profile_manager.h" | 17 | #include "core/hle/service/acc/profile_manager.h" |
| 16 | #include "core/hle/service/am/am.h" | 18 | #include "core/hle/service/am/am.h" |
| 17 | #include "core/hle/service/am/applet_ae.h" | 19 | #include "core/hle/service/am/applet_ae.h" |
| @@ -208,8 +210,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger | |||
| 208 | RegisterHandlers(functions); | 210 | RegisterHandlers(functions); |
| 209 | 211 | ||
| 210 | auto& kernel = Core::System::GetInstance().Kernel(); | 212 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 211 | launchable_event = | 213 | launchable_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 212 | Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "ISelfController:LaunchableEvent"); | 214 | "ISelfController:LaunchableEvent"); |
| 213 | } | 215 | } |
| 214 | 216 | ||
| 215 | ISelfController::~ISelfController() = default; | 217 | ISelfController::~ISelfController() = default; |
| @@ -295,11 +297,11 @@ void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) { | |||
| 295 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | 297 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { |
| 296 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 298 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| 297 | 299 | ||
| 298 | launchable_event->Signal(); | 300 | launchable_event.writable->Signal(); |
| 299 | 301 | ||
| 300 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 302 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 301 | rb.Push(RESULT_SUCCESS); | 303 | rb.Push(RESULT_SUCCESS); |
| 302 | rb.PushCopyObjects(launchable_event); | 304 | rb.PushCopyObjects(launchable_event.readable); |
| 303 | } | 305 | } |
| 304 | 306 | ||
| 305 | void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { | 307 | void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { |
| @@ -348,36 +350,38 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c | |||
| 348 | 350 | ||
| 349 | AppletMessageQueue::AppletMessageQueue() { | 351 | AppletMessageQueue::AppletMessageQueue() { |
| 350 | auto& kernel = Core::System::GetInstance().Kernel(); | 352 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 351 | on_new_message = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, | 353 | on_new_message = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 352 | "AMMessageQueue:OnMessageRecieved"); | 354 | "AMMessageQueue:OnMessageRecieved"); |
| 353 | on_operation_mode_changed = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 355 | on_operation_mode_changed = Kernel::WritableEvent::CreateEventPair( |
| 354 | "AMMessageQueue:OperationModeChanged"); | 356 | kernel, Kernel::ResetType::OneShot, "AMMessageQueue:OperationModeChanged"); |
| 355 | } | 357 | } |
| 356 | 358 | ||
| 357 | AppletMessageQueue::~AppletMessageQueue() = default; | 359 | AppletMessageQueue::~AppletMessageQueue() = default; |
| 358 | 360 | ||
| 359 | const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetMesssageRecieveEvent() const { | 361 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent() |
| 360 | return on_new_message; | 362 | const { |
| 363 | return on_new_message.readable; | ||
| 361 | } | 364 | } |
| 362 | 365 | ||
| 363 | const Kernel::SharedPtr<Kernel::Event>& AppletMessageQueue::GetOperationModeChangedEvent() const { | 366 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() |
| 364 | return on_operation_mode_changed; | 367 | const { |
| 368 | return on_operation_mode_changed.readable; | ||
| 365 | } | 369 | } |
| 366 | 370 | ||
| 367 | void AppletMessageQueue::PushMessage(AppletMessage msg) { | 371 | void AppletMessageQueue::PushMessage(AppletMessage msg) { |
| 368 | messages.push(msg); | 372 | messages.push(msg); |
| 369 | on_new_message->Signal(); | 373 | on_new_message.writable->Signal(); |
| 370 | } | 374 | } |
| 371 | 375 | ||
| 372 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | 376 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { |
| 373 | if (messages.empty()) { | 377 | if (messages.empty()) { |
| 374 | on_new_message->Clear(); | 378 | on_new_message.writable->Clear(); |
| 375 | return AppletMessage::NoMessage; | 379 | return AppletMessage::NoMessage; |
| 376 | } | 380 | } |
| 377 | auto msg = messages.front(); | 381 | auto msg = messages.front(); |
| 378 | messages.pop(); | 382 | messages.pop(); |
| 379 | if (messages.empty()) { | 383 | if (messages.empty()) { |
| 380 | on_new_message->Clear(); | 384 | on_new_message.writable->Clear(); |
| 381 | } | 385 | } |
| 382 | return msg; | 386 | return msg; |
| 383 | } | 387 | } |
| @@ -389,7 +393,7 @@ std::size_t AppletMessageQueue::GetMessageCount() const { | |||
| 389 | void AppletMessageQueue::OperationModeChanged() { | 393 | void AppletMessageQueue::OperationModeChanged() { |
| 390 | PushMessage(AppletMessage::OperationModeChanged); | 394 | PushMessage(AppletMessage::OperationModeChanged); |
| 391 | PushMessage(AppletMessage::PerformanceModeChanged); | 395 | PushMessage(AppletMessage::PerformanceModeChanged); |
| 392 | on_operation_mode_changed->Signal(); | 396 | on_operation_mode_changed.writable->Signal(); |
| 393 | } | 397 | } |
| 394 | 398 | ||
| 395 | ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) | 399 | ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) |
| @@ -426,9 +430,6 @@ ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_q | |||
| 426 | // clang-format on | 430 | // clang-format on |
| 427 | 431 | ||
| 428 | RegisterHandlers(functions); | 432 | RegisterHandlers(functions); |
| 429 | |||
| 430 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 431 | event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "ICommonStateGetter:Event"); | ||
| 432 | } | 433 | } |
| 433 | 434 | ||
| 434 | ICommonStateGetter::~ICommonStateGetter() = default; | 435 | ICommonStateGetter::~ICommonStateGetter() = default; |
| @@ -564,8 +565,8 @@ private: | |||
| 564 | void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { | 565 | void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { |
| 565 | LOG_DEBUG(Service_AM, "called"); | 566 | LOG_DEBUG(Service_AM, "called"); |
| 566 | 567 | ||
| 568 | applet->GetBroker().SignalStateChanged(); | ||
| 567 | const auto event = applet->GetBroker().GetStateChangedEvent(); | 569 | const auto event = applet->GetBroker().GetStateChangedEvent(); |
| 568 | event->Signal(); | ||
| 569 | 570 | ||
| 570 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 571 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 571 | rb.Push(RESULT_SUCCESS); | 572 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 44c1bcde5..34c45fadf 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -6,12 +6,9 @@ | |||
| 6 | 6 | ||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include <queue> | 8 | #include <queue> |
| 9 | #include "core/hle/kernel/writable_event.h" | ||
| 9 | #include "core/hle/service/service.h" | 10 | #include "core/hle/service/service.h" |
| 10 | 11 | ||
| 11 | namespace Kernel { | ||
| 12 | class Event; | ||
| 13 | } | ||
| 14 | |||
| 15 | namespace Service { | 12 | namespace Service { |
| 16 | namespace NVFlinger { | 13 | namespace NVFlinger { |
| 17 | class NVFlinger; | 14 | class NVFlinger; |
| @@ -52,8 +49,8 @@ public: | |||
| 52 | AppletMessageQueue(); | 49 | AppletMessageQueue(); |
| 53 | ~AppletMessageQueue(); | 50 | ~AppletMessageQueue(); |
| 54 | 51 | ||
| 55 | const Kernel::SharedPtr<Kernel::Event>& GetMesssageRecieveEvent() const; | 52 | const Kernel::SharedPtr<Kernel::ReadableEvent>& GetMesssageRecieveEvent() const; |
| 56 | const Kernel::SharedPtr<Kernel::Event>& GetOperationModeChangedEvent() const; | 53 | const Kernel::SharedPtr<Kernel::ReadableEvent>& GetOperationModeChangedEvent() const; |
| 57 | void PushMessage(AppletMessage msg); | 54 | void PushMessage(AppletMessage msg); |
| 58 | AppletMessage PopMessage(); | 55 | AppletMessage PopMessage(); |
| 59 | std::size_t GetMessageCount() const; | 56 | std::size_t GetMessageCount() const; |
| @@ -61,8 +58,8 @@ public: | |||
| 61 | 58 | ||
| 62 | private: | 59 | private: |
| 63 | std::queue<AppletMessage> messages; | 60 | std::queue<AppletMessage> messages; |
| 64 | Kernel::SharedPtr<Kernel::Event> on_new_message; | 61 | Kernel::EventPair on_new_message; |
| 65 | Kernel::SharedPtr<Kernel::Event> on_operation_mode_changed; | 62 | Kernel::EventPair on_operation_mode_changed; |
| 66 | }; | 63 | }; |
| 67 | 64 | ||
| 68 | class IWindowController final : public ServiceFramework<IWindowController> { | 65 | class IWindowController final : public ServiceFramework<IWindowController> { |
| @@ -122,7 +119,7 @@ private: | |||
| 122 | void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); | 119 | void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); |
| 123 | 120 | ||
| 124 | std::shared_ptr<NVFlinger::NVFlinger> nvflinger; | 121 | std::shared_ptr<NVFlinger::NVFlinger> nvflinger; |
| 125 | Kernel::SharedPtr<Kernel::Event> launchable_event; | 122 | Kernel::EventPair launchable_event; |
| 126 | u32 idle_time_detection_extension = 0; | 123 | u32 idle_time_detection_extension = 0; |
| 127 | }; | 124 | }; |
| 128 | 125 | ||
| @@ -151,7 +148,6 @@ private: | |||
| 151 | void GetBootMode(Kernel::HLERequestContext& ctx); | 148 | void GetBootMode(Kernel::HLERequestContext& ctx); |
| 152 | void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx); | 149 | void GetDefaultDisplayResolution(Kernel::HLERequestContext& ctx); |
| 153 | 150 | ||
| 154 | Kernel::SharedPtr<Kernel::Event> event; | ||
| 155 | std::shared_ptr<AppletMessageQueue> msg_queue; | 151 | std::shared_ptr<AppletMessageQueue> msg_queue; |
| 156 | }; | 152 | }; |
| 157 | 153 | ||
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index becbadd06..47da35537 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp | |||
| @@ -5,8 +5,9 @@ | |||
| 5 | #include <cstring> | 5 | #include <cstring> |
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/hle/kernel/event.h" | 8 | #include "core/hle/kernel/readable_event.h" |
| 9 | #include "core/hle/kernel/server_port.h" | 9 | #include "core/hle/kernel/server_port.h" |
| 10 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | #include "core/hle/service/am/am.h" | 11 | #include "core/hle/service/am/am.h" |
| 11 | #include "core/hle/service/am/applets/applets.h" | 12 | #include "core/hle/service/am/applets/applets.h" |
| 12 | 13 | ||
| @@ -14,11 +15,11 @@ namespace Service::AM::Applets { | |||
| 14 | 15 | ||
| 15 | AppletDataBroker::AppletDataBroker() { | 16 | AppletDataBroker::AppletDataBroker() { |
| 16 | auto& kernel = Core::System::GetInstance().Kernel(); | 17 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 17 | state_changed_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 18 | state_changed_event = Kernel::WritableEvent::CreateEventPair( |
| 18 | "ILibraryAppletAccessor:StateChangedEvent"); | 19 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:StateChangedEvent"); |
| 19 | pop_out_data_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 20 | pop_out_data_event = Kernel::WritableEvent::CreateEventPair( |
| 20 | "ILibraryAppletAccessor:PopDataOutEvent"); | 21 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopDataOutEvent"); |
| 21 | pop_interactive_out_data_event = Kernel::Event::Create( | 22 | pop_interactive_out_data_event = Kernel::WritableEvent::CreateEventPair( |
| 22 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | 23 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); |
| 23 | } | 24 | } |
| 24 | 25 | ||
| @@ -66,7 +67,7 @@ void AppletDataBroker::PushNormalDataFromGame(IStorage storage) { | |||
| 66 | 67 | ||
| 67 | void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { | 68 | void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { |
| 68 | out_channel.push(std::make_unique<IStorage>(storage)); | 69 | out_channel.push(std::make_unique<IStorage>(storage)); |
| 69 | pop_out_data_event->Signal(); | 70 | pop_out_data_event.writable->Signal(); |
| 70 | } | 71 | } |
| 71 | 72 | ||
| 72 | void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | 73 | void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { |
| @@ -75,23 +76,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | |||
| 75 | 76 | ||
| 76 | void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { | 77 | void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { |
| 77 | out_interactive_channel.push(std::make_unique<IStorage>(storage)); | 78 | out_interactive_channel.push(std::make_unique<IStorage>(storage)); |
| 78 | pop_interactive_out_data_event->Signal(); | 79 | pop_interactive_out_data_event.writable->Signal(); |
| 79 | } | 80 | } |
| 80 | 81 | ||
| 81 | void AppletDataBroker::SignalStateChanged() const { | 82 | void AppletDataBroker::SignalStateChanged() const { |
| 82 | state_changed_event->Signal(); | 83 | state_changed_event.writable->Signal(); |
| 83 | } | 84 | } |
| 84 | 85 | ||
| 85 | Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetNormalDataEvent() const { | 86 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const { |
| 86 | return pop_out_data_event; | 87 | return pop_out_data_event.readable; |
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetInteractiveDataEvent() const { | 90 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { |
| 90 | return pop_interactive_out_data_event; | 91 | return pop_interactive_out_data_event.readable; |
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetStateChangedEvent() const { | 94 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const { |
| 94 | return state_changed_event; | 95 | return state_changed_event.readable; |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | Applet::Applet() = default; | 98 | Applet::Applet() = default; |
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index f65ea119c..b0a8913c3 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -8,13 +8,10 @@ | |||
| 8 | #include <queue> | 8 | #include <queue> |
| 9 | #include "common/swap.h" | 9 | #include "common/swap.h" |
| 10 | #include "core/hle/kernel/kernel.h" | 10 | #include "core/hle/kernel/kernel.h" |
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 11 | 12 | ||
| 12 | union ResultCode; | 13 | union ResultCode; |
| 13 | 14 | ||
| 14 | namespace Kernel { | ||
| 15 | class Event; | ||
| 16 | } | ||
| 17 | |||
| 18 | namespace Service::AM { | 15 | namespace Service::AM { |
| 19 | 16 | ||
| 20 | class IStorage; | 17 | class IStorage; |
| @@ -40,9 +37,9 @@ public: | |||
| 40 | 37 | ||
| 41 | void SignalStateChanged() const; | 38 | void SignalStateChanged() const; |
| 42 | 39 | ||
| 43 | Kernel::SharedPtr<Kernel::Event> GetNormalDataEvent() const; | 40 | Kernel::SharedPtr<Kernel::ReadableEvent> GetNormalDataEvent() const; |
| 44 | Kernel::SharedPtr<Kernel::Event> GetInteractiveDataEvent() const; | 41 | Kernel::SharedPtr<Kernel::ReadableEvent> GetInteractiveDataEvent() const; |
| 45 | Kernel::SharedPtr<Kernel::Event> GetStateChangedEvent() const; | 42 | Kernel::SharedPtr<Kernel::ReadableEvent> GetStateChangedEvent() const; |
| 46 | 43 | ||
| 47 | private: | 44 | private: |
| 48 | // Queues are named from applet's perspective | 45 | // Queues are named from applet's perspective |
| @@ -59,13 +56,13 @@ private: | |||
| 59 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet | 56 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet |
| 60 | std::queue<std::unique_ptr<IStorage>> out_interactive_channel; | 57 | std::queue<std::unique_ptr<IStorage>> out_interactive_channel; |
| 61 | 58 | ||
| 62 | Kernel::SharedPtr<Kernel::Event> state_changed_event; | 59 | Kernel::EventPair state_changed_event; |
| 63 | 60 | ||
| 64 | // Signaled on PushNormalDataFromApplet | 61 | // Signaled on PushNormalDataFromApplet |
| 65 | Kernel::SharedPtr<Kernel::Event> pop_out_data_event; | 62 | Kernel::EventPair pop_out_data_event; |
| 66 | 63 | ||
| 67 | // Signaled on PushInteractiveDataFromApplet | 64 | // Signaled on PushInteractiveDataFromApplet |
| 68 | Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event; | 65 | Kernel::EventPair pop_interactive_out_data_event; |
| 69 | }; | 66 | }; |
| 70 | 67 | ||
| 71 | class Applet { | 68 | class Applet { |
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index bacf19de2..b276de332 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp | |||
| @@ -13,8 +13,10 @@ | |||
| 13 | #include "core/file_sys/patch_manager.h" | 13 | #include "core/file_sys/patch_manager.h" |
| 14 | #include "core/file_sys/registered_cache.h" | 14 | #include "core/file_sys/registered_cache.h" |
| 15 | #include "core/hle/ipc_helpers.h" | 15 | #include "core/hle/ipc_helpers.h" |
| 16 | #include "core/hle/kernel/event.h" | 16 | #include "core/hle/kernel/kernel.h" |
| 17 | #include "core/hle/kernel/process.h" | 17 | #include "core/hle/kernel/process.h" |
| 18 | #include "core/hle/kernel/readable_event.h" | ||
| 19 | #include "core/hle/kernel/writable_event.h" | ||
| 18 | #include "core/hle/service/aoc/aoc_u.h" | 20 | #include "core/hle/service/aoc/aoc_u.h" |
| 19 | #include "core/hle/service/filesystem/filesystem.h" | 21 | #include "core/hle/service/filesystem/filesystem.h" |
| 20 | #include "core/loader/loader.h" | 22 | #include "core/loader/loader.h" |
| @@ -61,8 +63,8 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs | |||
| 61 | RegisterHandlers(functions); | 63 | RegisterHandlers(functions); |
| 62 | 64 | ||
| 63 | auto& kernel = Core::System::GetInstance().Kernel(); | 65 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 64 | aoc_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, | 66 | aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 65 | "GetAddOnContentListChanged:Event"); | 67 | "GetAddOnContentListChanged:Event"); |
| 66 | } | 68 | } |
| 67 | 69 | ||
| 68 | AOC_U::~AOC_U() = default; | 70 | AOC_U::~AOC_U() = default; |
| @@ -144,7 +146,7 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | |||
| 144 | 146 | ||
| 145 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 147 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 146 | rb.Push(RESULT_SUCCESS); | 148 | rb.Push(RESULT_SUCCESS); |
| 147 | rb.PushCopyObjects(aoc_change_event); | 149 | rb.PushCopyObjects(aoc_change_event.readable); |
| 148 | } | 150 | } |
| 149 | 151 | ||
| 150 | void InstallInterfaces(SM::ServiceManager& service_manager) { | 152 | void InstallInterfaces(SM::ServiceManager& service_manager) { |
diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h index 68d94fdaa..5effea730 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h | |||
| @@ -6,6 +6,10 @@ | |||
| 6 | 6 | ||
| 7 | #include "core/hle/service/service.h" | 7 | #include "core/hle/service/service.h" |
| 8 | 8 | ||
| 9 | namespace Kernel { | ||
| 10 | class WritableEvent; | ||
| 11 | } | ||
| 12 | |||
| 9 | namespace Service::AOC { | 13 | namespace Service::AOC { |
| 10 | 14 | ||
| 11 | class AOC_U final : public ServiceFramework<AOC_U> { | 15 | class AOC_U final : public ServiceFramework<AOC_U> { |
| @@ -21,7 +25,7 @@ private: | |||
| 21 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); | 25 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); |
| 22 | 26 | ||
| 23 | std::vector<u64> add_on_content; | 27 | std::vector<u64> add_on_content; |
| 24 | Kernel::SharedPtr<Kernel::Event> aoc_change_event; | 28 | Kernel::EventPair aoc_change_event; |
| 25 | }; | 29 | }; |
| 26 | 30 | ||
| 27 | /// Registers all AOC services with the specified service manager. | 31 | /// Registers all AOC services with the specified service manager. |
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index d0dd1ef10..dc6a6b188 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp | |||
| @@ -13,8 +13,10 @@ | |||
| 13 | #include "common/swap.h" | 13 | #include "common/swap.h" |
| 14 | #include "core/core.h" | 14 | #include "core/core.h" |
| 15 | #include "core/hle/ipc_helpers.h" | 15 | #include "core/hle/ipc_helpers.h" |
| 16 | #include "core/hle/kernel/event.h" | ||
| 17 | #include "core/hle/kernel/hle_ipc.h" | 16 | #include "core/hle/kernel/hle_ipc.h" |
| 17 | #include "core/hle/kernel/kernel.h" | ||
| 18 | #include "core/hle/kernel/readable_event.h" | ||
| 19 | #include "core/hle/kernel/writable_event.h" | ||
| 18 | #include "core/hle/service/audio/audout_u.h" | 20 | #include "core/hle/service/audio/audout_u.h" |
| 19 | #include "core/memory.h" | 21 | #include "core/memory.h" |
| 20 | 22 | ||
| @@ -67,11 +69,12 @@ public: | |||
| 67 | 69 | ||
| 68 | // This is the event handle used to check if the audio buffer was released | 70 | // This is the event handle used to check if the audio buffer was released |
| 69 | auto& kernel = Core::System::GetInstance().Kernel(); | 71 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 70 | buffer_event = | 72 | buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 71 | Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioOutBufferReleased"); | 73 | "IAudioOutBufferReleased"); |
| 72 | 74 | ||
| 73 | stream = audio_core.OpenStream(audio_params.sample_rate, audio_params.channel_count, | 75 | stream = audio_core.OpenStream(audio_params.sample_rate, audio_params.channel_count, |
| 74 | std::move(unique_name), [=]() { buffer_event->Signal(); }); | 76 | std::move(unique_name), |
| 77 | [=]() { buffer_event.writable->Signal(); }); | ||
| 75 | } | 78 | } |
| 76 | 79 | ||
| 77 | private: | 80 | private: |
| @@ -121,7 +124,7 @@ private: | |||
| 121 | 124 | ||
| 122 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 125 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 123 | rb.Push(RESULT_SUCCESS); | 126 | rb.Push(RESULT_SUCCESS); |
| 124 | rb.PushCopyObjects(buffer_event); | 127 | rb.PushCopyObjects(buffer_event.readable); |
| 125 | } | 128 | } |
| 126 | 129 | ||
| 127 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { | 130 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { |
| @@ -187,8 +190,8 @@ private: | |||
| 187 | 190 | ||
| 188 | AudoutParams audio_params{}; | 191 | AudoutParams audio_params{}; |
| 189 | 192 | ||
| 190 | /// This is the evend handle used to check if the audio buffer was released | 193 | /// This is the event handle used to check if the audio buffer was released |
| 191 | Kernel::SharedPtr<Kernel::Event> buffer_event; | 194 | Kernel::EventPair buffer_event; |
| 192 | }; | 195 | }; |
| 193 | 196 | ||
| 194 | void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) { | 197 | void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 1c418a9bb..945259c7d 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -12,8 +12,10 @@ | |||
| 12 | #include "common/logging/log.h" | 12 | #include "common/logging/log.h" |
| 13 | #include "core/core.h" | 13 | #include "core/core.h" |
| 14 | #include "core/hle/ipc_helpers.h" | 14 | #include "core/hle/ipc_helpers.h" |
| 15 | #include "core/hle/kernel/event.h" | ||
| 16 | #include "core/hle/kernel/hle_ipc.h" | 15 | #include "core/hle/kernel/hle_ipc.h" |
| 16 | #include "core/hle/kernel/kernel.h" | ||
| 17 | #include "core/hle/kernel/readable_event.h" | ||
| 18 | #include "core/hle/kernel/writable_event.h" | ||
| 17 | #include "core/hle/service/audio/audren_u.h" | 19 | #include "core/hle/service/audio/audren_u.h" |
| 18 | 20 | ||
| 19 | namespace Service::Audio { | 21 | namespace Service::Audio { |
| @@ -41,14 +43,14 @@ public: | |||
| 41 | RegisterHandlers(functions); | 43 | RegisterHandlers(functions); |
| 42 | 44 | ||
| 43 | auto& kernel = Core::System::GetInstance().Kernel(); | 45 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 44 | system_event = | 46 | system_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 45 | Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "IAudioRenderer:SystemEvent"); | 47 | "IAudioRenderer:SystemEvent"); |
| 46 | renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event); | 48 | renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event.writable); |
| 47 | } | 49 | } |
| 48 | 50 | ||
| 49 | private: | 51 | private: |
| 50 | void UpdateAudioCallback() { | 52 | void UpdateAudioCallback() { |
| 51 | system_event->Signal(); | 53 | system_event.writable->Signal(); |
| 52 | } | 54 | } |
| 53 | 55 | ||
| 54 | void GetSampleRate(Kernel::HLERequestContext& ctx) { | 56 | void GetSampleRate(Kernel::HLERequestContext& ctx) { |
| @@ -112,7 +114,7 @@ private: | |||
| 112 | 114 | ||
| 113 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 115 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 114 | rb.Push(RESULT_SUCCESS); | 116 | rb.Push(RESULT_SUCCESS); |
| 115 | rb.PushCopyObjects(system_event); | 117 | rb.PushCopyObjects(system_event.readable); |
| 116 | } | 118 | } |
| 117 | 119 | ||
| 118 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { | 120 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { |
| @@ -135,7 +137,7 @@ private: | |||
| 135 | rb.Push(rendering_time_limit_percent); | 137 | rb.Push(rendering_time_limit_percent); |
| 136 | } | 138 | } |
| 137 | 139 | ||
| 138 | Kernel::SharedPtr<Kernel::Event> system_event; | 140 | Kernel::EventPair system_event; |
| 139 | std::unique_ptr<AudioCore::AudioRenderer> renderer; | 141 | std::unique_ptr<AudioCore::AudioRenderer> renderer; |
| 140 | u32 rendering_time_limit_percent = 100; | 142 | u32 rendering_time_limit_percent = 100; |
| 141 | }; | 143 | }; |
| @@ -162,8 +164,8 @@ public: | |||
| 162 | RegisterHandlers(functions); | 164 | RegisterHandlers(functions); |
| 163 | 165 | ||
| 164 | auto& kernel = Core::System::GetInstance().Kernel(); | 166 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 165 | buffer_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 167 | buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 166 | "IAudioOutBufferReleasedEvent"); | 168 | "IAudioOutBufferReleasedEvent"); |
| 167 | } | 169 | } |
| 168 | 170 | ||
| 169 | private: | 171 | private: |
| @@ -207,11 +209,11 @@ private: | |||
| 207 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { | 209 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { |
| 208 | LOG_WARNING(Service_Audio, "(STUBBED) called"); | 210 | LOG_WARNING(Service_Audio, "(STUBBED) called"); |
| 209 | 211 | ||
| 210 | buffer_event->Signal(); | 212 | buffer_event.writable->Signal(); |
| 211 | 213 | ||
| 212 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 214 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 213 | rb.Push(RESULT_SUCCESS); | 215 | rb.Push(RESULT_SUCCESS); |
| 214 | rb.PushCopyObjects(buffer_event); | 216 | rb.PushCopyObjects(buffer_event.readable); |
| 215 | } | 217 | } |
| 216 | 218 | ||
| 217 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { | 219 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { |
| @@ -222,7 +224,7 @@ private: | |||
| 222 | rb.Push<u32>(1); | 224 | rb.Push<u32>(1); |
| 223 | } | 225 | } |
| 224 | 226 | ||
| 225 | Kernel::SharedPtr<Kernel::Event> buffer_event; | 227 | Kernel::EventPair buffer_event; |
| 226 | 228 | ||
| 227 | }; // namespace Audio | 229 | }; // namespace Audio |
| 228 | 230 | ||
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 2eadcdd05..5704ca0ab 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp | |||
| @@ -4,8 +4,10 @@ | |||
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | #include "core/hle/ipc_helpers.h" | 6 | #include "core/hle/ipc_helpers.h" |
| 7 | #include "core/hle/kernel/event.h" | ||
| 8 | #include "core/hle/kernel/hle_ipc.h" | 7 | #include "core/hle/kernel/hle_ipc.h" |
| 8 | #include "core/hle/kernel/kernel.h" | ||
| 9 | #include "core/hle/kernel/readable_event.h" | ||
| 10 | #include "core/hle/kernel/writable_event.h" | ||
| 9 | #include "core/hle/service/btdrv/btdrv.h" | 11 | #include "core/hle/service/btdrv/btdrv.h" |
| 10 | #include "core/hle/service/service.h" | 12 | #include "core/hle/service/service.h" |
| 11 | #include "core/hle/service/sm/sm.h" | 13 | #include "core/hle/service/sm/sm.h" |
| @@ -30,20 +32,22 @@ public: | |||
| 30 | }; | 32 | }; |
| 31 | // clang-format on | 33 | // clang-format on |
| 32 | RegisterHandlers(functions); | 34 | RegisterHandlers(functions); |
| 35 | |||
| 36 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 37 | register_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||
| 38 | "BT:RegisterEvent"); | ||
| 33 | } | 39 | } |
| 34 | 40 | ||
| 35 | private: | 41 | private: |
| 36 | void RegisterEvent(Kernel::HLERequestContext& ctx) { | 42 | void RegisterEvent(Kernel::HLERequestContext& ctx) { |
| 37 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 43 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 38 | 44 | ||
| 39 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 40 | register_event = | ||
| 41 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "BT:RegisterEvent"); | ||
| 42 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 45 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 43 | rb.Push(RESULT_SUCCESS); | 46 | rb.Push(RESULT_SUCCESS); |
| 44 | rb.PushCopyObjects(register_event); | 47 | rb.PushCopyObjects(register_event.readable); |
| 45 | } | 48 | } |
| 46 | Kernel::SharedPtr<Kernel::Event> register_event; | 49 | |
| 50 | Kernel::EventPair register_event; | ||
| 47 | }; | 51 | }; |
| 48 | 52 | ||
| 49 | class BtDrv final : public ServiceFramework<BtDrv> { | 53 | class BtDrv final : public ServiceFramework<BtDrv> { |
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index 463a79351..ef7398a23 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp | |||
| @@ -6,8 +6,10 @@ | |||
| 6 | 6 | ||
| 7 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| 8 | #include "core/hle/ipc_helpers.h" | 8 | #include "core/hle/ipc_helpers.h" |
| 9 | #include "core/hle/kernel/event.h" | ||
| 10 | #include "core/hle/kernel/hle_ipc.h" | 9 | #include "core/hle/kernel/hle_ipc.h" |
| 10 | #include "core/hle/kernel/kernel.h" | ||
| 11 | #include "core/hle/kernel/readable_event.h" | ||
| 12 | #include "core/hle/kernel/writable_event.h" | ||
| 11 | #include "core/hle/service/btm/btm.h" | 13 | #include "core/hle/service/btm/btm.h" |
| 12 | #include "core/hle/service/service.h" | 14 | #include "core/hle/service/service.h" |
| 13 | 15 | ||
| @@ -53,53 +55,55 @@ public: | |||
| 53 | }; | 55 | }; |
| 54 | // clang-format on | 56 | // clang-format on |
| 55 | RegisterHandlers(functions); | 57 | RegisterHandlers(functions); |
| 58 | |||
| 59 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 60 | scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||
| 61 | "IBtmUserCore:ScanEvent"); | ||
| 62 | connection_event = Kernel::WritableEvent::CreateEventPair( | ||
| 63 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConnectionEvent"); | ||
| 64 | service_discovery = Kernel::WritableEvent::CreateEventPair( | ||
| 65 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); | ||
| 66 | config_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||
| 67 | "IBtmUserCore:ConfigEvent"); | ||
| 56 | } | 68 | } |
| 57 | 69 | ||
| 58 | private: | 70 | private: |
| 59 | void GetScanEvent(Kernel::HLERequestContext& ctx) { | 71 | void GetScanEvent(Kernel::HLERequestContext& ctx) { |
| 60 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 72 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 61 | 73 | ||
| 62 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 63 | scan_event = | ||
| 64 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ScanEvent"); | ||
| 65 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 74 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 66 | rb.Push(RESULT_SUCCESS); | 75 | rb.Push(RESULT_SUCCESS); |
| 67 | rb.PushCopyObjects(scan_event); | 76 | rb.PushCopyObjects(scan_event.readable); |
| 68 | } | 77 | } |
| 78 | |||
| 69 | void GetConnectionEvent(Kernel::HLERequestContext& ctx) { | 79 | void GetConnectionEvent(Kernel::HLERequestContext& ctx) { |
| 70 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 80 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 71 | 81 | ||
| 72 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 73 | connection_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | ||
| 74 | "IBtmUserCore:ConnectionEvent"); | ||
| 75 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 82 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 76 | rb.Push(RESULT_SUCCESS); | 83 | rb.Push(RESULT_SUCCESS); |
| 77 | rb.PushCopyObjects(connection_event); | 84 | rb.PushCopyObjects(connection_event.readable); |
| 78 | } | 85 | } |
| 86 | |||
| 79 | void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { | 87 | void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { |
| 80 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 88 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 81 | 89 | ||
| 82 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 83 | service_discovery = | ||
| 84 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); | ||
| 85 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 90 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 86 | rb.Push(RESULT_SUCCESS); | 91 | rb.Push(RESULT_SUCCESS); |
| 87 | rb.PushCopyObjects(service_discovery); | 92 | rb.PushCopyObjects(service_discovery.readable); |
| 88 | } | 93 | } |
| 94 | |||
| 89 | void GetConfigEvent(Kernel::HLERequestContext& ctx) { | 95 | void GetConfigEvent(Kernel::HLERequestContext& ctx) { |
| 90 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 96 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 91 | 97 | ||
| 92 | auto& kernel = Core::System::GetInstance().Kernel(); | ||
| 93 | config_event = | ||
| 94 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConfigEvent"); | ||
| 95 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 98 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 96 | rb.Push(RESULT_SUCCESS); | 99 | rb.Push(RESULT_SUCCESS); |
| 97 | rb.PushCopyObjects(config_event); | 100 | rb.PushCopyObjects(config_event.readable); |
| 98 | } | 101 | } |
| 99 | Kernel::SharedPtr<Kernel::Event> scan_event; | 102 | |
| 100 | Kernel::SharedPtr<Kernel::Event> connection_event; | 103 | Kernel::EventPair scan_event; |
| 101 | Kernel::SharedPtr<Kernel::Event> service_discovery; | 104 | Kernel::EventPair connection_event; |
| 102 | Kernel::SharedPtr<Kernel::Event> config_event; | 105 | Kernel::EventPair service_discovery; |
| 106 | Kernel::EventPair config_event; | ||
| 103 | }; | 107 | }; |
| 104 | 108 | ||
| 105 | class BTM_USR final : public ServiceFramework<BTM_USR> { | 109 | class BTM_USR final : public ServiceFramework<BTM_USR> { |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index b49e34594..d6829d0b8 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -12,7 +12,9 @@ | |||
| 12 | #include "core/core.h" | 12 | #include "core/core.h" |
| 13 | #include "core/core_timing.h" | 13 | #include "core/core_timing.h" |
| 14 | #include "core/frontend/input.h" | 14 | #include "core/frontend/input.h" |
| 15 | #include "core/hle/kernel/event.h" | 15 | #include "core/hle/kernel/kernel.h" |
| 16 | #include "core/hle/kernel/readable_event.h" | ||
| 17 | #include "core/hle/kernel/writable_event.h" | ||
| 16 | #include "core/hle/service/hid/controllers/npad.h" | 18 | #include "core/hle/service/hid/controllers/npad.h" |
| 17 | #include "core/settings.h" | 19 | #include "core/settings.h" |
| 18 | 20 | ||
| @@ -167,8 +169,8 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | |||
| 167 | 169 | ||
| 168 | void Controller_NPad::OnInit() { | 170 | void Controller_NPad::OnInit() { |
| 169 | auto& kernel = Core::System::GetInstance().Kernel(); | 171 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 170 | styleset_changed_event = | 172 | styleset_changed_event = Kernel::WritableEvent::CreateEventPair( |
| 171 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); | 173 | kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); |
| 172 | 174 | ||
| 173 | if (!IsControllerActivated()) { | 175 | if (!IsControllerActivated()) { |
| 174 | return; | 176 | return; |
| @@ -494,7 +496,7 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | |||
| 494 | had_controller_update = true; | 496 | had_controller_update = true; |
| 495 | } | 497 | } |
| 496 | if (had_controller_update) { | 498 | if (had_controller_update) { |
| 497 | styleset_changed_event->Signal(); | 499 | styleset_changed_event.writable->Signal(); |
| 498 | } | 500 | } |
| 499 | } | 501 | } |
| 500 | } | 502 | } |
| @@ -509,7 +511,7 @@ std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const { | |||
| 509 | } | 511 | } |
| 510 | 512 | ||
| 511 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { | 513 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { |
| 512 | styleset_changed_event->Signal(); | 514 | styleset_changed_event.writable->Signal(); |
| 513 | hold_type = joy_hold_type; | 515 | hold_type = joy_hold_type; |
| 514 | } | 516 | } |
| 515 | 517 | ||
| @@ -539,11 +541,11 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | |||
| 539 | last_processed_vibration = vibrations.back(); | 541 | last_processed_vibration = vibrations.back(); |
| 540 | } | 542 | } |
| 541 | 543 | ||
| 542 | Kernel::SharedPtr<Kernel::Event> Controller_NPad::GetStyleSetChangedEvent() const { | 544 | Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { |
| 543 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should | 545 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should |
| 544 | // be signalled at least once, and signaled after a new controller is connected? | 546 | // be signalled at least once, and signaled after a new controller is connected? |
| 545 | styleset_changed_event->Signal(); | 547 | styleset_changed_event.writable->Signal(); |
| 546 | return styleset_changed_event; | 548 | return styleset_changed_event.readable; |
| 547 | } | 549 | } |
| 548 | 550 | ||
| 549 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | 551 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index abff6544d..29851f16a 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -8,7 +8,8 @@ | |||
| 8 | #include "common/bit_field.h" | 8 | #include "common/bit_field.h" |
| 9 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 10 | #include "core/frontend/input.h" | 10 | #include "core/frontend/input.h" |
| 11 | #include "core/hle/kernel/event.h" | 11 | #include "core/hle/kernel/object.h" |
| 12 | #include "core/hle/kernel/writable_event.h" | ||
| 12 | #include "core/hle/service/hid/controllers/controller_base.h" | 13 | #include "core/hle/service/hid/controllers/controller_base.h" |
| 13 | #include "core/settings.h" | 14 | #include "core/settings.h" |
| 14 | 15 | ||
| @@ -108,7 +109,7 @@ public: | |||
| 108 | void VibrateController(const std::vector<u32>& controller_ids, | 109 | void VibrateController(const std::vector<u32>& controller_ids, |
| 109 | const std::vector<Vibration>& vibrations); | 110 | const std::vector<Vibration>& vibrations); |
| 110 | 111 | ||
| 111 | Kernel::SharedPtr<Kernel::Event> GetStyleSetChangedEvent() const; | 112 | Kernel::SharedPtr<Kernel::ReadableEvent> GetStyleSetChangedEvent() const; |
| 112 | Vibration GetLastVibration() const; | 113 | Vibration GetLastVibration() const; |
| 113 | 114 | ||
| 114 | void AddNewController(NPadControllerType controller); | 115 | void AddNewController(NPadControllerType controller); |
| @@ -303,7 +304,7 @@ private: | |||
| 303 | sticks; | 304 | sticks; |
| 304 | std::vector<u32> supported_npad_id_types{}; | 305 | std::vector<u32> supported_npad_id_types{}; |
| 305 | NpadHoldType hold_type{NpadHoldType::Vertical}; | 306 | NpadHoldType hold_type{NpadHoldType::Vertical}; |
| 306 | Kernel::SharedPtr<Kernel::Event> styleset_changed_event; | 307 | Kernel::EventPair styleset_changed_event; |
| 307 | Vibration last_processed_vibration{}; | 308 | Vibration last_processed_vibration{}; |
| 308 | std::array<ControllerHolder, 10> connected_controllers{}; | 309 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 309 | bool can_controllers_vibrate{true}; | 310 | bool can_controllers_vibrate{true}; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 46496e9bb..2ec38c726 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -13,8 +13,9 @@ | |||
| 13 | #include "core/hle/ipc_helpers.h" | 13 | #include "core/hle/ipc_helpers.h" |
| 14 | #include "core/hle/kernel/client_port.h" | 14 | #include "core/hle/kernel/client_port.h" |
| 15 | #include "core/hle/kernel/client_session.h" | 15 | #include "core/hle/kernel/client_session.h" |
| 16 | #include "core/hle/kernel/event.h" | 16 | #include "core/hle/kernel/readable_event.h" |
| 17 | #include "core/hle/kernel/shared_memory.h" | 17 | #include "core/hle/kernel/shared_memory.h" |
| 18 | #include "core/hle/kernel/writable_event.h" | ||
| 18 | #include "core/hle/service/hid/hid.h" | 19 | #include "core/hle/service/hid/hid.h" |
| 19 | #include "core/hle/service/hid/irs.h" | 20 | #include "core/hle/service/hid/irs.h" |
| 20 | #include "core/hle/service/hid/xcd.h" | 21 | #include "core/hle/service/hid/xcd.h" |
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index ff9170c24..d5df112a0 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp | |||
| @@ -7,7 +7,9 @@ | |||
| 7 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 10 | #include "core/hle/kernel/event.h" | 10 | #include "core/hle/kernel/kernel.h" |
| 11 | #include "core/hle/kernel/readable_event.h" | ||
| 12 | #include "core/hle/kernel/writable_event.h" | ||
| 11 | #include "core/hle/lock.h" | 13 | #include "core/hle/lock.h" |
| 12 | #include "core/hle/service/hid/hid.h" | 14 | #include "core/hle/service/hid/hid.h" |
| 13 | #include "core/hle/service/nfp/nfp.h" | 15 | #include "core/hle/service/nfp/nfp.h" |
| @@ -23,8 +25,8 @@ constexpr ResultCode ERR_TAG_FAILED(ErrorModule::NFP, | |||
| 23 | Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | 25 | Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) |
| 24 | : ServiceFramework(name), module(std::move(module)) { | 26 | : ServiceFramework(name), module(std::move(module)) { |
| 25 | auto& kernel = Core::System::GetInstance().Kernel(); | 27 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 26 | nfc_tag_load = | 28 | nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 27 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:NFCTagDetected"); | 29 | "IUser:NFCTagDetected"); |
| 28 | } | 30 | } |
| 29 | 31 | ||
| 30 | Module::Interface::~Interface() = default; | 32 | Module::Interface::~Interface() = default; |
| @@ -63,10 +65,10 @@ public: | |||
| 63 | RegisterHandlers(functions); | 65 | RegisterHandlers(functions); |
| 64 | 66 | ||
| 65 | auto& kernel = Core::System::GetInstance().Kernel(); | 67 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 66 | deactivate_event = | 68 | deactivate_event = Kernel::WritableEvent::CreateEventPair( |
| 67 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); | 69 | kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); |
| 68 | availability_change_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 70 | availability_change_event = Kernel::WritableEvent::CreateEventPair( |
| 69 | "IUser:AvailabilityChangeEvent"); | 71 | kernel, Kernel::ResetType::OneShot, "IUser:AvailabilityChangeEvent"); |
| 70 | } | 72 | } |
| 71 | 73 | ||
| 72 | private: | 74 | private: |
| @@ -164,7 +166,7 @@ private: | |||
| 164 | 166 | ||
| 165 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 167 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 166 | rb.Push(RESULT_SUCCESS); | 168 | rb.Push(RESULT_SUCCESS); |
| 167 | rb.PushCopyObjects(deactivate_event); | 169 | rb.PushCopyObjects(deactivate_event.readable); |
| 168 | } | 170 | } |
| 169 | 171 | ||
| 170 | void StopDetection(Kernel::HLERequestContext& ctx) { | 172 | void StopDetection(Kernel::HLERequestContext& ctx) { |
| @@ -173,7 +175,7 @@ private: | |||
| 173 | switch (device_state) { | 175 | switch (device_state) { |
| 174 | case DeviceState::TagFound: | 176 | case DeviceState::TagFound: |
| 175 | case DeviceState::TagNearby: | 177 | case DeviceState::TagNearby: |
| 176 | deactivate_event->Signal(); | 178 | deactivate_event.writable->Signal(); |
| 177 | device_state = DeviceState::Initialized; | 179 | device_state = DeviceState::Initialized; |
| 178 | break; | 180 | break; |
| 179 | case DeviceState::SearchingForTag: | 181 | case DeviceState::SearchingForTag: |
| @@ -264,7 +266,7 @@ private: | |||
| 264 | 266 | ||
| 265 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 267 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 266 | rb.Push(RESULT_SUCCESS); | 268 | rb.Push(RESULT_SUCCESS); |
| 267 | rb.PushCopyObjects(availability_change_event); | 269 | rb.PushCopyObjects(availability_change_event.readable); |
| 268 | } | 270 | } |
| 269 | 271 | ||
| 270 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { | 272 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { |
| @@ -319,8 +321,8 @@ private: | |||
| 319 | const u32 npad_id{0}; // Player 1 controller | 321 | const u32 npad_id{0}; // Player 1 controller |
| 320 | State state{State::NonInitialized}; | 322 | State state{State::NonInitialized}; |
| 321 | DeviceState device_state{DeviceState::Initialized}; | 323 | DeviceState device_state{DeviceState::Initialized}; |
| 322 | Kernel::SharedPtr<Kernel::Event> deactivate_event; | 324 | Kernel::EventPair deactivate_event; |
| 323 | Kernel::SharedPtr<Kernel::Event> availability_change_event; | 325 | Kernel::EventPair availability_change_event; |
| 324 | const Module::Interface& nfp_interface; | 326 | const Module::Interface& nfp_interface; |
| 325 | }; | 327 | }; |
| 326 | 328 | ||
| @@ -339,12 +341,14 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | |||
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); | 343 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); |
| 342 | nfc_tag_load->Signal(); | 344 | nfc_tag_load.writable->Signal(); |
| 343 | return true; | 345 | return true; |
| 344 | } | 346 | } |
| 345 | const Kernel::SharedPtr<Kernel::Event>& Module::Interface::GetNFCEvent() const { | 347 | |
| 346 | return nfc_tag_load; | 348 | const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const { |
| 349 | return nfc_tag_load.readable; | ||
| 347 | } | 350 | } |
| 351 | |||
| 348 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { | 352 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { |
| 349 | return amiibo; | 353 | return amiibo; |
| 350 | } | 354 | } |
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index 5c0ae8a54..a1817e991 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h | |||
| @@ -6,7 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <vector> | 8 | #include <vector> |
| 9 | #include "core/hle/kernel/event.h" | 9 | #include "core/hle/kernel/readable_event.h" |
| 10 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | #include "core/hle/service/service.h" | 11 | #include "core/hle/service/service.h" |
| 11 | 12 | ||
| 12 | namespace Service::NFP { | 13 | namespace Service::NFP { |
| @@ -33,11 +34,11 @@ public: | |||
| 33 | 34 | ||
| 34 | void CreateUserInterface(Kernel::HLERequestContext& ctx); | 35 | void CreateUserInterface(Kernel::HLERequestContext& ctx); |
| 35 | bool LoadAmiibo(const std::vector<u8>& buffer); | 36 | bool LoadAmiibo(const std::vector<u8>& buffer); |
| 36 | const Kernel::SharedPtr<Kernel::Event>& GetNFCEvent() const; | 37 | const Kernel::SharedPtr<Kernel::ReadableEvent>& GetNFCEvent() const; |
| 37 | const AmiiboFile& GetAmiiboBuffer() const; | 38 | const AmiiboFile& GetAmiiboBuffer() const; |
| 38 | 39 | ||
| 39 | private: | 40 | private: |
| 40 | Kernel::SharedPtr<Kernel::Event> nfc_tag_load{}; | 41 | Kernel::EventPair nfc_tag_load{}; |
| 41 | AmiiboFile amiibo{}; | 42 | AmiiboFile amiibo{}; |
| 42 | 43 | ||
| 43 | protected: | 44 | protected: |
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index dee391201..60479bb45 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp | |||
| @@ -4,7 +4,9 @@ | |||
| 4 | 4 | ||
| 5 | #include "core/core.h" | 5 | #include "core/core.h" |
| 6 | #include "core/hle/ipc_helpers.h" | 6 | #include "core/hle/ipc_helpers.h" |
| 7 | #include "core/hle/kernel/event.h" | 7 | #include "core/hle/kernel/kernel.h" |
| 8 | #include "core/hle/kernel/readable_event.h" | ||
| 9 | #include "core/hle/kernel/writable_event.h" | ||
| 8 | #include "core/hle/service/nifm/nifm.h" | 10 | #include "core/hle/service/nifm/nifm.h" |
| 9 | #include "core/hle/service/service.h" | 11 | #include "core/hle/service/service.h" |
| 10 | 12 | ||
| @@ -56,8 +58,10 @@ public: | |||
| 56 | RegisterHandlers(functions); | 58 | RegisterHandlers(functions); |
| 57 | 59 | ||
| 58 | auto& kernel = Core::System::GetInstance().Kernel(); | 60 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 59 | event1 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event1"); | 61 | event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 60 | event2 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event2"); | 62 | "IRequest:Event1"); |
| 63 | event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, | ||
| 64 | "IRequest:Event2"); | ||
| 61 | } | 65 | } |
| 62 | 66 | ||
| 63 | private: | 67 | private: |
| @@ -88,7 +92,7 @@ private: | |||
| 88 | 92 | ||
| 89 | IPC::ResponseBuilder rb{ctx, 2, 2}; | 93 | IPC::ResponseBuilder rb{ctx, 2, 2}; |
| 90 | rb.Push(RESULT_SUCCESS); | 94 | rb.Push(RESULT_SUCCESS); |
| 91 | rb.PushCopyObjects(event1, event2); | 95 | rb.PushCopyObjects(event1.readable, event2.readable); |
| 92 | } | 96 | } |
| 93 | 97 | ||
| 94 | void Cancel(Kernel::HLERequestContext& ctx) { | 98 | void Cancel(Kernel::HLERequestContext& ctx) { |
| @@ -105,7 +109,7 @@ private: | |||
| 105 | rb.Push(RESULT_SUCCESS); | 109 | rb.Push(RESULT_SUCCESS); |
| 106 | } | 110 | } |
| 107 | 111 | ||
| 108 | Kernel::SharedPtr<Kernel::Event> event1, event2; | 112 | Kernel::EventPair event1, event2; |
| 109 | }; | 113 | }; |
| 110 | 114 | ||
| 111 | class INetworkProfile final : public ServiceFramework<INetworkProfile> { | 115 | class INetworkProfile final : public ServiceFramework<INetworkProfile> { |
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index 1bbccd444..0dabcd23b 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp | |||
| @@ -6,7 +6,9 @@ | |||
| 6 | #include <ctime> | 6 | #include <ctime> |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/hle/ipc_helpers.h" | 8 | #include "core/hle/ipc_helpers.h" |
| 9 | #include "core/hle/kernel/event.h" | 9 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/kernel/readable_event.h" | ||
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | #include "core/hle/service/nim/nim.h" | 12 | #include "core/hle/service/nim/nim.h" |
| 11 | #include "core/hle/service/service.h" | 13 | #include "core/hle/service/service.h" |
| 12 | #include "core/hle/service/sm/sm.h" | 14 | #include "core/hle/service/sm/sm.h" |
| @@ -138,19 +140,18 @@ public: | |||
| 138 | RegisterHandlers(functions); | 140 | RegisterHandlers(functions); |
| 139 | 141 | ||
| 140 | auto& kernel = Core::System::GetInstance().Kernel(); | 142 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 141 | finished_event = | 143 | finished_event = Kernel::WritableEvent::CreateEventPair( |
| 142 | Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, | 144 | kernel, Kernel::ResetType::OneShot, |
| 143 | "IEnsureNetworkClockAvailabilityService:FinishEvent"); | 145 | "IEnsureNetworkClockAvailabilityService:FinishEvent"); |
| 144 | } | 146 | } |
| 145 | 147 | ||
| 146 | private: | 148 | private: |
| 147 | Kernel::SharedPtr<Kernel::Event> finished_event; | 149 | Kernel::EventPair finished_event; |
| 148 | 150 | ||
| 149 | void StartTask(Kernel::HLERequestContext& ctx) { | 151 | void StartTask(Kernel::HLERequestContext& ctx) { |
| 150 | // No need to connect to the internet, just finish the task straight away. | 152 | // No need to connect to the internet, just finish the task straight away. |
| 151 | LOG_DEBUG(Service_NIM, "called"); | 153 | LOG_DEBUG(Service_NIM, "called"); |
| 152 | 154 | finished_event.writable->Signal(); | |
| 153 | finished_event->Signal(); | ||
| 154 | IPC::ResponseBuilder rb{ctx, 2}; | 155 | IPC::ResponseBuilder rb{ctx, 2}; |
| 155 | rb.Push(RESULT_SUCCESS); | 156 | rb.Push(RESULT_SUCCESS); |
| 156 | } | 157 | } |
| @@ -160,7 +161,7 @@ private: | |||
| 160 | 161 | ||
| 161 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 162 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 162 | rb.Push(RESULT_SUCCESS); | 163 | rb.Push(RESULT_SUCCESS); |
| 163 | rb.PushCopyObjects(finished_event); | 164 | rb.PushCopyObjects(finished_event.readable); |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 166 | void GetResult(Kernel::HLERequestContext& ctx) { | 167 | void GetResult(Kernel::HLERequestContext& ctx) { |
| @@ -172,8 +173,7 @@ private: | |||
| 172 | 173 | ||
| 173 | void Cancel(Kernel::HLERequestContext& ctx) { | 174 | void Cancel(Kernel::HLERequestContext& ctx) { |
| 174 | LOG_DEBUG(Service_NIM, "called"); | 175 | LOG_DEBUG(Service_NIM, "called"); |
| 175 | 176 | finished_event.writable->Clear(); | |
| 176 | finished_event->Clear(); | ||
| 177 | IPC::ResponseBuilder rb{ctx, 2}; | 177 | IPC::ResponseBuilder rb{ctx, 2}; |
| 178 | rb.Push(RESULT_SUCCESS); | 178 | rb.Push(RESULT_SUCCESS); |
| 179 | } | 179 | } |
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp index ff76e0524..3b9ab4b14 100644 --- a/src/core/hle/service/nvdrv/interface.cpp +++ b/src/core/hle/service/nvdrv/interface.cpp | |||
| @@ -6,7 +6,9 @@ | |||
| 6 | #include "common/logging/log.h" | 6 | #include "common/logging/log.h" |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/hle/ipc_helpers.h" | 8 | #include "core/hle/ipc_helpers.h" |
| 9 | #include "core/hle/kernel/event.h" | 9 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/kernel/readable_event.h" | ||
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | #include "core/hle/service/nvdrv/interface.h" | 12 | #include "core/hle/service/nvdrv/interface.h" |
| 11 | #include "core/hle/service/nvdrv/nvdrv.h" | 13 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 12 | 14 | ||
| @@ -69,7 +71,7 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) { | |||
| 69 | 71 | ||
| 70 | IPC::ResponseBuilder rb{ctx, 3, 1}; | 72 | IPC::ResponseBuilder rb{ctx, 3, 1}; |
| 71 | rb.Push(RESULT_SUCCESS); | 73 | rb.Push(RESULT_SUCCESS); |
| 72 | rb.PushCopyObjects(query_event); | 74 | rb.PushCopyObjects(query_event.readable); |
| 73 | rb.Push<u32>(0); | 75 | rb.Push<u32>(0); |
| 74 | } | 76 | } |
| 75 | 77 | ||
| @@ -127,7 +129,8 @@ NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name) | |||
| 127 | RegisterHandlers(functions); | 129 | RegisterHandlers(functions); |
| 128 | 130 | ||
| 129 | auto& kernel = Core::System::GetInstance().Kernel(); | 131 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 130 | query_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "NVDRV::query_event"); | 132 | query_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 133 | "NVDRV::query_event"); | ||
| 131 | } | 134 | } |
| 132 | 135 | ||
| 133 | NVDRV::~NVDRV() = default; | 136 | NVDRV::~NVDRV() = default; |
diff --git a/src/core/hle/service/nvdrv/interface.h b/src/core/hle/service/nvdrv/interface.h index 5a1e4baa7..fe311b069 100644 --- a/src/core/hle/service/nvdrv/interface.h +++ b/src/core/hle/service/nvdrv/interface.h | |||
| @@ -5,10 +5,13 @@ | |||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include "core/hle/kernel/event.h" | ||
| 9 | #include "core/hle/service/nvdrv/nvdrv.h" | 8 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 10 | #include "core/hle/service/service.h" | 9 | #include "core/hle/service/service.h" |
| 11 | 10 | ||
| 11 | namespace Kernel { | ||
| 12 | class WritableEvent; | ||
| 13 | } | ||
| 14 | |||
| 12 | namespace Service::Nvidia { | 15 | namespace Service::Nvidia { |
| 13 | 16 | ||
| 14 | class NVDRV final : public ServiceFramework<NVDRV> { | 17 | class NVDRV final : public ServiceFramework<NVDRV> { |
| @@ -31,7 +34,7 @@ private: | |||
| 31 | 34 | ||
| 32 | u64 pid{}; | 35 | u64 pid{}; |
| 33 | 36 | ||
| 34 | Kernel::SharedPtr<Kernel::Event> query_event; | 37 | Kernel::EventPair query_event; |
| 35 | }; | 38 | }; |
| 36 | 39 | ||
| 37 | } // namespace Service::Nvidia | 40 | } // namespace Service::Nvidia |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 172a1a441..fc07d9bb8 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -7,14 +7,17 @@ | |||
| 7 | #include "common/assert.h" | 7 | #include "common/assert.h" |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/hle/kernel/kernel.h" | ||
| 11 | #include "core/hle/kernel/readable_event.h" | ||
| 12 | #include "core/hle/kernel/writable_event.h" | ||
| 10 | #include "core/hle/service/nvflinger/buffer_queue.h" | 13 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| 11 | 14 | ||
| 12 | namespace Service::NVFlinger { | 15 | namespace Service::NVFlinger { |
| 13 | 16 | ||
| 14 | BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) { | 17 | BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) { |
| 15 | auto& kernel = Core::System::GetInstance().Kernel(); | 18 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 16 | buffer_wait_event = | 19 | buffer_wait_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 17 | Kernel::Event::Create(kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle"); | 20 | "BufferQueue NativeHandle"); |
| 18 | } | 21 | } |
| 19 | 22 | ||
| 20 | BufferQueue::~BufferQueue() = default; | 23 | BufferQueue::~BufferQueue() = default; |
| @@ -28,7 +31,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | |||
| 28 | buffer.status = Buffer::Status::Free; | 31 | buffer.status = Buffer::Status::Free; |
| 29 | 32 | ||
| 30 | queue.emplace_back(buffer); | 33 | queue.emplace_back(buffer); |
| 31 | buffer_wait_event->Signal(); | 34 | buffer_wait_event.writable->Signal(); |
| 32 | } | 35 | } |
| 33 | 36 | ||
| 34 | std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { | 37 | std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { |
| @@ -87,7 +90,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | |||
| 87 | ASSERT(itr->status == Buffer::Status::Acquired); | 90 | ASSERT(itr->status == Buffer::Status::Acquired); |
| 88 | itr->status = Buffer::Status::Free; | 91 | itr->status = Buffer::Status::Free; |
| 89 | 92 | ||
| 90 | buffer_wait_event->Signal(); | 93 | buffer_wait_event.writable->Signal(); |
| 91 | } | 94 | } |
| 92 | 95 | ||
| 93 | u32 BufferQueue::Query(QueryType type) { | 96 | u32 BufferQueue::Query(QueryType type) { |
| @@ -104,4 +107,12 @@ u32 BufferQueue::Query(QueryType type) { | |||
| 104 | return 0; | 107 | return 0; |
| 105 | } | 108 | } |
| 106 | 109 | ||
| 110 | Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { | ||
| 111 | return buffer_wait_event.writable; | ||
| 112 | } | ||
| 113 | |||
| 114 | Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const { | ||
| 115 | return buffer_wait_event.readable; | ||
| 116 | } | ||
| 117 | |||
| 107 | } // namespace Service::NVFlinger | 118 | } // namespace Service::NVFlinger |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index 8cff5eb71..b171f256c 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -10,7 +10,8 @@ | |||
| 10 | #include "common/common_funcs.h" | 10 | #include "common/common_funcs.h" |
| 11 | #include "common/math_util.h" | 11 | #include "common/math_util.h" |
| 12 | #include "common/swap.h" | 12 | #include "common/swap.h" |
| 13 | #include "core/hle/kernel/event.h" | 13 | #include "core/hle/kernel/object.h" |
| 14 | #include "core/hle/kernel/writable_event.h" | ||
| 14 | 15 | ||
| 15 | namespace CoreTiming { | 16 | namespace CoreTiming { |
| 16 | struct EventType; | 17 | struct EventType; |
| @@ -86,16 +87,16 @@ public: | |||
| 86 | return id; | 87 | return id; |
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | Kernel::SharedPtr<Kernel::Event> GetBufferWaitEvent() const { | 90 | Kernel::SharedPtr<Kernel::WritableEvent> GetWritableBufferWaitEvent() const; |
| 90 | return buffer_wait_event; | 91 | |
| 91 | } | 92 | Kernel::SharedPtr<Kernel::ReadableEvent> GetBufferWaitEvent() const; |
| 92 | 93 | ||
| 93 | private: | 94 | private: |
| 94 | u32 id; | 95 | u32 id; |
| 95 | u64 layer_id; | 96 | u64 layer_id; |
| 96 | 97 | ||
| 97 | std::vector<Buffer> queue; | 98 | std::vector<Buffer> queue; |
| 98 | Kernel::SharedPtr<Kernel::Event> buffer_wait_event; | 99 | Kernel::EventPair buffer_wait_event; |
| 99 | }; | 100 | }; |
| 100 | 101 | ||
| 101 | } // namespace Service::NVFlinger | 102 | } // namespace Service::NVFlinger |
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 214e6d1b3..05af2d593 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -13,6 +13,9 @@ | |||
| 13 | #include "core/core.h" | 13 | #include "core/core.h" |
| 14 | #include "core/core_timing.h" | 14 | #include "core/core_timing.h" |
| 15 | #include "core/core_timing_util.h" | 15 | #include "core/core_timing_util.h" |
| 16 | #include "core/hle/kernel/kernel.h" | ||
| 17 | #include "core/hle/kernel/readable_event.h" | ||
| 18 | #include "core/hle/kernel/writable_event.h" | ||
| 16 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" | 19 | #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" |
| 17 | #include "core/hle/service/nvdrv/nvdrv.h" | 20 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 18 | #include "core/hle/service/nvflinger/buffer_queue.h" | 21 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| @@ -83,9 +86,8 @@ u32 NVFlinger::GetBufferQueueId(u64 display_id, u64 layer_id) { | |||
| 83 | return layer.buffer_queue->GetId(); | 86 | return layer.buffer_queue->GetId(); |
| 84 | } | 87 | } |
| 85 | 88 | ||
| 86 | Kernel::SharedPtr<Kernel::Event> NVFlinger::GetVsyncEvent(u64 display_id) { | 89 | Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) { |
| 87 | const auto& display = GetDisplay(display_id); | 90 | return GetDisplay(display_id).vsync_event.readable; |
| 88 | return display.vsync_event; | ||
| 89 | } | 91 | } |
| 90 | 92 | ||
| 91 | std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { | 93 | std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { |
| @@ -117,7 +119,7 @@ Layer& NVFlinger::GetLayer(u64 display_id, u64 layer_id) { | |||
| 117 | void NVFlinger::Compose() { | 119 | void NVFlinger::Compose() { |
| 118 | for (auto& display : displays) { | 120 | for (auto& display : displays) { |
| 119 | // Trigger vsync for this display at the end of drawing | 121 | // Trigger vsync for this display at the end of drawing |
| 120 | SCOPE_EXIT({ display.vsync_event->Signal(); }); | 122 | SCOPE_EXIT({ display.vsync_event.writable->Signal(); }); |
| 121 | 123 | ||
| 122 | // Don't do anything for displays without layers. | 124 | // Don't do anything for displays without layers. |
| 123 | if (display.layers.empty()) | 125 | if (display.layers.empty()) |
| @@ -164,7 +166,8 @@ Layer::~Layer() = default; | |||
| 164 | 166 | ||
| 165 | Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { | 167 | Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { |
| 166 | auto& kernel = Core::System::GetInstance().Kernel(); | 168 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 167 | vsync_event = Kernel::Event::Create(kernel, Kernel::ResetType::Pulse, "Display VSync Event"); | 169 | vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Pulse, |
| 170 | fmt::format("Display VSync Event {}", id)); | ||
| 168 | } | 171 | } |
| 169 | 172 | ||
| 170 | Display::~Display() = default; | 173 | Display::~Display() = default; |
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index 3dc69e69b..9abba555b 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -10,12 +10,17 @@ | |||
| 10 | #include <vector> | 10 | #include <vector> |
| 11 | 11 | ||
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "core/hle/kernel/event.h" | 13 | #include "core/hle/kernel/object.h" |
| 14 | 14 | ||
| 15 | namespace CoreTiming { | 15 | namespace CoreTiming { |
| 16 | struct EventType; | 16 | struct EventType; |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | namespace Kernel { | ||
| 20 | class ReadableEvent; | ||
| 21 | class WritableEvent; | ||
| 22 | } // namespace Kernel | ||
| 23 | |||
| 19 | namespace Service::Nvidia { | 24 | namespace Service::Nvidia { |
| 20 | class Module; | 25 | class Module; |
| 21 | } | 26 | } |
| @@ -40,7 +45,7 @@ struct Display { | |||
| 40 | std::string name; | 45 | std::string name; |
| 41 | 46 | ||
| 42 | std::vector<Layer> layers; | 47 | std::vector<Layer> layers; |
| 43 | Kernel::SharedPtr<Kernel::Event> vsync_event; | 48 | Kernel::EventPair vsync_event; |
| 44 | }; | 49 | }; |
| 45 | 50 | ||
| 46 | class NVFlinger final { | 51 | class NVFlinger final { |
| @@ -61,7 +66,7 @@ public: | |||
| 61 | u32 GetBufferQueueId(u64 display_id, u64 layer_id); | 66 | u32 GetBufferQueueId(u64 display_id, u64 layer_id); |
| 62 | 67 | ||
| 63 | /// Gets the vsync event for the specified display. | 68 | /// Gets the vsync event for the specified display. |
| 64 | Kernel::SharedPtr<Kernel::Event> GetVsyncEvent(u64 display_id); | 69 | Kernel::SharedPtr<Kernel::ReadableEvent> GetVsyncEvent(u64 display_id); |
| 65 | 70 | ||
| 66 | /// Obtains a buffer queue identified by the id. | 71 | /// Obtains a buffer queue identified by the id. |
| 67 | std::shared_ptr<BufferQueue> GetBufferQueue(u32 id) const; | 72 | std::shared_ptr<BufferQueue> GetBufferQueue(u32 id) const; |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 412d5b0c9..311b0c765 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -18,7 +18,8 @@ | |||
| 18 | #include "common/swap.h" | 18 | #include "common/swap.h" |
| 19 | #include "core/core_timing.h" | 19 | #include "core/core_timing.h" |
| 20 | #include "core/hle/ipc_helpers.h" | 20 | #include "core/hle/ipc_helpers.h" |
| 21 | #include "core/hle/kernel/event.h" | 21 | #include "core/hle/kernel/readable_event.h" |
| 22 | #include "core/hle/kernel/writable_event.h" | ||
| 22 | #include "core/hle/service/nvdrv/nvdrv.h" | 23 | #include "core/hle/service/nvdrv/nvdrv.h" |
| 23 | #include "core/hle/service/nvflinger/buffer_queue.h" | 24 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| 24 | #include "core/hle/service/nvflinger/nvflinger.h" | 25 | #include "core/hle/service/nvflinger/nvflinger.h" |
| @@ -549,7 +550,7 @@ private: | |||
| 549 | IPC::ResponseBuilder rb{ctx, 2}; | 550 | IPC::ResponseBuilder rb{ctx, 2}; |
| 550 | rb.Push(RESULT_SUCCESS); | 551 | rb.Push(RESULT_SUCCESS); |
| 551 | }, | 552 | }, |
| 552 | buffer_queue->GetBufferWaitEvent()); | 553 | buffer_queue->GetWritableBufferWaitEvent()); |
| 553 | } | 554 | } |
| 554 | } else if (transaction == TransactionId::RequestBuffer) { | 555 | } else if (transaction == TransactionId::RequestBuffer) { |
| 555 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | 556 | IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; |