diff options
| author | 2018-11-27 09:18:29 -0500 | |
|---|---|---|
| committer | 2018-11-29 08:48:40 -0500 | |
| commit | a342bcc9b130e9bd78720e09e04c92dcac8840d0 (patch) | |
| tree | df1d16c2a71b121fc449b53fc931c6fac8ccf82a /src/core | |
| parent | core: Port all current usages of Event to Readable/WritableEvent (diff) | |
| download | yuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.tar.gz yuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.tar.xz yuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.zip | |
kernel/event: Reference ReadableEvent from WritableEvent
Diffstat (limited to 'src/core')
30 files changed, 169 insertions, 311 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 2ffdb2f5b..21fda42d6 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -53,8 +53,10 @@ SharedPtr<WritableEvent> HLERequestContext::SleepClientThread( | |||
| 53 | auto& kernel = Core::System::GetInstance().Kernel(); | 53 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 54 | if (!writable_event || !readable_event) { | 54 | if (!writable_event || !readable_event) { |
| 55 | // Create event if not provided | 55 | // Create event if not provided |
| 56 | std::tie(writable_event, readable_event) = WritableEvent::CreateEventPair( | 56 | const auto pair = WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 57 | kernel, Kernel::ResetType::OneShot, "HLE Pause Event: " + reason); | 57 | "HLE Pause Event: " + reason); |
| 58 | writable_event = pair.writable; | ||
| 59 | readable_event = pair.readable; | ||
| 58 | } | 60 | } |
| 59 | 61 | ||
| 60 | writable_event->Clear(); | 62 | writable_event->Clear(); |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 9cd714586..21d7f3483 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -177,10 +177,6 @@ struct KernelCore::Impl { | |||
| 177 | // allowing us to simply use a pool index or similar. | 177 | // allowing us to simply use a pool index or similar. |
| 178 | Kernel::HandleTable thread_wakeup_callback_handle_table; | 178 | Kernel::HandleTable thread_wakeup_callback_handle_table; |
| 179 | 179 | ||
| 180 | /// Map of named events managed by the kernel, which are retrieved when HLE services need to | ||
| 181 | /// return an event to the system. | ||
| 182 | NamedEventTable named_events; | ||
| 183 | |||
| 184 | /// Map of named ports managed by the kernel, which can be retrieved using | 180 | /// Map of named ports managed by the kernel, which can be retrieved using |
| 185 | /// the ConnectToPort SVC. | 181 | /// the ConnectToPort SVC. |
| 186 | NamedPortTable named_ports; | 182 | NamedPortTable named_ports; |
| @@ -227,19 +223,6 @@ const Process* KernelCore::CurrentProcess() const { | |||
| 227 | return impl->current_process; | 223 | return impl->current_process; |
| 228 | } | 224 | } |
| 229 | 225 | ||
| 230 | void KernelCore::AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event) { | ||
| 231 | impl->named_events.emplace(std::move(name), std::move(event)); | ||
| 232 | } | ||
| 233 | |||
| 234 | KernelCore::NamedEventTable::iterator KernelCore::FindNamedEvent(const std::string& name) { | ||
| 235 | return impl->named_events.find(name); | ||
| 236 | } | ||
| 237 | |||
| 238 | KernelCore::NamedEventTable::const_iterator KernelCore::FindNamedEvent( | ||
| 239 | const std::string& name) const { | ||
| 240 | return impl->named_events.find(name); | ||
| 241 | } | ||
| 242 | |||
| 243 | void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { | 226 | void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { |
| 244 | impl->named_ports.emplace(std::move(name), std::move(port)); | 227 | impl->named_ports.emplace(std::move(name), std::move(port)); |
| 245 | } | 228 | } |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index f12d061eb..ea00c89f5 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -20,7 +20,6 @@ namespace Kernel { | |||
| 20 | class ClientPort; | 20 | class ClientPort; |
| 21 | class HandleTable; | 21 | class HandleTable; |
| 22 | class Process; | 22 | class Process; |
| 23 | class ReadableEvent; | ||
| 24 | class ResourceLimit; | 23 | class ResourceLimit; |
| 25 | class Thread; | 24 | class Thread; |
| 26 | class Timer; | 25 | class Timer; |
| @@ -28,7 +27,6 @@ class Timer; | |||
| 28 | /// Represents a single instance of the kernel. | 27 | /// Represents a single instance of the kernel. |
| 29 | class KernelCore { | 28 | class KernelCore { |
| 30 | private: | 29 | private: |
| 31 | using NamedEventTable = std::unordered_map<std::string, SharedPtr<ReadableEvent>>; | ||
| 32 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; | 30 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; |
| 33 | 31 | ||
| 34 | public: | 32 | public: |
| @@ -68,15 +66,6 @@ public: | |||
| 68 | /// Retrieves a const pointer to the current process. | 66 | /// Retrieves a const pointer to the current process. |
| 69 | const Process* CurrentProcess() const; | 67 | const Process* CurrentProcess() const; |
| 70 | 68 | ||
| 71 | /// Adds an event to the named event table | ||
| 72 | void AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event); | ||
| 73 | |||
| 74 | /// Finds an event within the named event table wit the given name. | ||
| 75 | NamedEventTable::iterator FindNamedEvent(const std::string& name); | ||
| 76 | |||
| 77 | /// Finds an event within the named event table wit the given name. | ||
| 78 | NamedEventTable::const_iterator FindNamedEvent(const std::string& name) const; | ||
| 79 | |||
| 80 | /// Adds a port to the named port table | 69 | /// Adds a port to the named port table |
| 81 | void AddNamedPort(std::string name, SharedPtr<ClientPort> port); | 70 | void AddNamedPort(std::string name, SharedPtr<ClientPort> port); |
| 82 | 71 | ||
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp index 164cffbdb..92e16b4e6 100644 --- a/src/core/hle/kernel/readable_event.cpp +++ b/src/core/hle/kernel/readable_event.cpp | |||
| @@ -15,34 +15,30 @@ ReadableEvent::ReadableEvent(KernelCore& kernel) : WaitObject{kernel} {} | |||
| 15 | ReadableEvent::~ReadableEvent() = default; | 15 | ReadableEvent::~ReadableEvent() = default; |
| 16 | 16 | ||
| 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { | 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { |
| 18 | return !writable_event->IsSignaled(); | 18 | return !signaled; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | void ReadableEvent::Acquire(Thread* thread) { | 21 | void ReadableEvent::Acquire(Thread* thread) { |
| 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); |
| 23 | 23 | ||
| 24 | writable_event->ResetOnAcquire(); | 24 | if (reset_type == ResetType::OneShot) |
| 25 | } | 25 | signaled = false; |
| 26 | |||
| 27 | void ReadableEvent::AddWaitingThread(SharedPtr<Thread> thread) { | ||
| 28 | writable_event->AddWaitingThread(thread); | ||
| 29 | } | ||
| 30 | |||
| 31 | void ReadableEvent::RemoveWaitingThread(Thread* thread) { | ||
| 32 | writable_event->RemoveWaitingThread(thread); | ||
| 33 | } | 26 | } |
| 34 | 27 | ||
| 35 | void ReadableEvent::Signal() { | 28 | void ReadableEvent::Signal() { |
| 36 | writable_event->Signal(); | 29 | signaled = true; |
| 30 | WakeupAllWaitingThreads(); | ||
| 37 | } | 31 | } |
| 38 | 32 | ||
| 39 | void ReadableEvent::Clear() { | 33 | void ReadableEvent::Clear() { |
| 40 | writable_event->Clear(); | 34 | signaled = false; |
| 41 | } | 35 | } |
| 42 | 36 | ||
| 43 | void ReadableEvent::WakeupAllWaitingThreads() { | 37 | void ReadableEvent::WakeupAllWaitingThreads() { |
| 44 | writable_event->WakeupAllWaitingThreads(); | 38 | WaitObject::WakeupAllWaitingThreads(); |
| 45 | writable_event->ResetOnWakeup(); | 39 | |
| 40 | if (reset_type == ResetType::Pulse) | ||
| 41 | signaled = false; | ||
| 46 | } | 42 | } |
| 47 | 43 | ||
| 48 | } // namespace Kernel | 44 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/readable_event.h b/src/core/hle/kernel/readable_event.h index 020ef4ebc..b1f1f4871 100644 --- a/src/core/hle/kernel/readable_event.h +++ b/src/core/hle/kernel/readable_event.h | |||
| @@ -25,6 +25,10 @@ public: | |||
| 25 | return name; | 25 | return name; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | ResetType GetResetType() const { | ||
| 29 | return reset_type; | ||
| 30 | } | ||
| 31 | |||
| 28 | static const HandleType HANDLE_TYPE = HandleType::Event; | 32 | static const HandleType HANDLE_TYPE = HandleType::Event; |
| 29 | HandleType GetHandleType() const override { | 33 | HandleType GetHandleType() const override { |
| 30 | return HANDLE_TYPE; | 34 | return HANDLE_TYPE; |
| @@ -35,20 +39,15 @@ public: | |||
| 35 | 39 | ||
| 36 | void WakeupAllWaitingThreads() override; | 40 | void WakeupAllWaitingThreads() override; |
| 37 | 41 | ||
| 38 | void AddWaitingThread(SharedPtr<Thread> thread) override; | ||
| 39 | void RemoveWaitingThread(Thread* thread) override; | ||
| 40 | |||
| 41 | void Signal(); | ||
| 42 | void Clear(); | 42 | void Clear(); |
| 43 | 43 | ||
| 44 | SharedPtr<WritableEvent> PromoteToWritable() const { | ||
| 45 | return writable_event; | ||
| 46 | } | ||
| 47 | |||
| 48 | private: | 44 | private: |
| 49 | explicit ReadableEvent(KernelCore& kernel); | 45 | explicit ReadableEvent(KernelCore& kernel); |
| 50 | 46 | ||
| 51 | SharedPtr<WritableEvent> writable_event; ///< WritableEvent associated with this ReadableEvent | 47 | void Signal(); |
| 48 | |||
| 49 | ResetType reset_type; | ||
| 50 | bool signaled; | ||
| 52 | 51 | ||
| 53 | std::string name; ///< Name of event (optional) | 52 | std::string name; ///< Name of event (optional) |
| 54 | }; | 53 | }; |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 85a9c50fb..abc48ee54 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1366,7 +1366,7 @@ static ResultCode ResetSignal(Handle handle) { | |||
| 1366 | 1366 | ||
| 1367 | ASSERT(event != nullptr); | 1367 | ASSERT(event != nullptr); |
| 1368 | 1368 | ||
| 1369 | event->PromoteToWritable()->Clear(); | 1369 | event->Clear(); |
| 1370 | return RESULT_SUCCESS; | 1370 | return RESULT_SUCCESS; |
| 1371 | } | 1371 | } |
| 1372 | 1372 | ||
| @@ -1531,7 +1531,7 @@ static ResultCode ClearEvent(Handle handle) { | |||
| 1531 | return ERR_INVALID_HANDLE; | 1531 | return ERR_INVALID_HANDLE; |
| 1532 | } | 1532 | } |
| 1533 | 1533 | ||
| 1534 | evt->PromoteToWritable()->Clear(); | 1534 | evt->Clear(); |
| 1535 | return RESULT_SUCCESS; | 1535 | return RESULT_SUCCESS; |
| 1536 | } | 1536 | } |
| 1537 | 1537 | ||
diff --git a/src/core/hle/kernel/writable_event.cpp b/src/core/hle/kernel/writable_event.cpp index 4eb387ac0..27d7ff734 100644 --- a/src/core/hle/kernel/writable_event.cpp +++ b/src/core/hle/kernel/writable_event.cpp | |||
| @@ -12,70 +12,37 @@ | |||
| 12 | 12 | ||
| 13 | namespace Kernel { | 13 | namespace Kernel { |
| 14 | 14 | ||
| 15 | WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {} | 15 | WritableEvent::WritableEvent(KernelCore& kernel) : Object{kernel} {} |
| 16 | WritableEvent::~WritableEvent() = default; | 16 | WritableEvent::~WritableEvent() = default; |
| 17 | 17 | ||
| 18 | std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> WritableEvent::CreateEventPair( | 18 | EventPair WritableEvent::CreateEventPair(KernelCore& kernel, ResetType reset_type, |
| 19 | KernelCore& kernel, ResetType reset_type, std::string name) { | 19 | std::string name) { |
| 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); | 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); |
| 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); | 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); |
| 22 | 22 | ||
| 23 | writable_event->name = name + ":Writable"; | 23 | writable_event->name = name + ":Writable"; |
| 24 | writable_event->signaled = false; | 24 | writable_event->readable = readable_event; |
| 25 | writable_event->reset_type = reset_type; | ||
| 26 | readable_event->name = name + ":Readable"; | 25 | readable_event->name = name + ":Readable"; |
| 27 | readable_event->writable_event = writable_event; | 26 | readable_event->signaled = false; |
| 27 | readable_event->reset_type = reset_type; | ||
| 28 | 28 | ||
| 29 | return std::make_tuple(std::move(writable_event), std::move(readable_event)); | 29 | return {std::move(readable_event), std::move(writable_event)}; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | SharedPtr<WritableEvent> WritableEvent::CreateRegisteredEventPair(KernelCore& kernel, | 32 | ResetType WritableEvent::GetResetType() const { |
| 33 | ResetType reset_type, | 33 | return readable->reset_type; |
| 34 | std::string name) { | ||
| 35 | auto [writable_event, readable_event] = CreateEventPair(kernel, reset_type, name); | ||
| 36 | kernel.AddNamedEvent(name, std::move(readable_event)); | ||
| 37 | return std::move(writable_event); | ||
| 38 | } | ||
| 39 | |||
| 40 | bool WritableEvent::ShouldWait(Thread* thread) const { | ||
| 41 | return !signaled; | ||
| 42 | } | ||
| 43 | |||
| 44 | void WritableEvent::Acquire(Thread* thread) { | ||
| 45 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | ||
| 46 | |||
| 47 | if (reset_type == ResetType::OneShot) | ||
| 48 | signaled = false; | ||
| 49 | } | 34 | } |
| 50 | 35 | ||
| 51 | void WritableEvent::Signal() { | 36 | void WritableEvent::Signal() { |
| 52 | signaled = true; | 37 | readable->Signal(); |
| 53 | WakeupAllWaitingThreads(); | ||
| 54 | } | 38 | } |
| 55 | 39 | ||
| 56 | void WritableEvent::Clear() { | 40 | void WritableEvent::Clear() { |
| 57 | signaled = false; | 41 | readable->Clear(); |
| 58 | } | ||
| 59 | |||
| 60 | void WritableEvent::ResetOnAcquire() { | ||
| 61 | if (reset_type == ResetType::OneShot) | ||
| 62 | Clear(); | ||
| 63 | } | ||
| 64 | |||
| 65 | void WritableEvent::ResetOnWakeup() { | ||
| 66 | if (reset_type == ResetType::Pulse) | ||
| 67 | Clear(); | ||
| 68 | } | 42 | } |
| 69 | 43 | ||
| 70 | bool WritableEvent::IsSignaled() const { | 44 | bool WritableEvent::IsSignaled() const { |
| 71 | return signaled; | 45 | return readable->signaled; |
| 72 | } | ||
| 73 | |||
| 74 | void WritableEvent::WakeupAllWaitingThreads() { | ||
| 75 | WaitObject::WakeupAllWaitingThreads(); | ||
| 76 | |||
| 77 | if (reset_type == ResetType::Pulse) | ||
| 78 | signaled = false; | ||
| 79 | } | 46 | } |
| 80 | 47 | ||
| 81 | } // namespace Kernel | 48 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/writable_event.h b/src/core/hle/kernel/writable_event.h index c0fe42302..4357d1b9f 100644 --- a/src/core/hle/kernel/writable_event.h +++ b/src/core/hle/kernel/writable_event.h | |||
| @@ -12,8 +12,14 @@ namespace Kernel { | |||
| 12 | 12 | ||
| 13 | class KernelCore; | 13 | class KernelCore; |
| 14 | class ReadableEvent; | 14 | class ReadableEvent; |
| 15 | class WritableEvent; | ||
| 15 | 16 | ||
| 16 | class WritableEvent final : public WaitObject { | 17 | struct EventPair { |
| 18 | SharedPtr<ReadableEvent> readable; | ||
| 19 | SharedPtr<WritableEvent> writable; | ||
| 20 | }; | ||
| 21 | |||
| 22 | class WritableEvent final : public Object { | ||
| 17 | public: | 23 | public: |
| 18 | ~WritableEvent() override; | 24 | ~WritableEvent() override; |
| 19 | 25 | ||
| @@ -23,18 +29,8 @@ public: | |||
| 23 | * @param reset_type ResetType describing how to create event | 29 | * @param reset_type ResetType describing how to create event |
| 24 | * @param name Optional name of event | 30 | * @param name Optional name of event |
| 25 | */ | 31 | */ |
| 26 | static std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> CreateEventPair( | 32 | static EventPair CreateEventPair(KernelCore& kernel, ResetType reset_type, |
| 27 | KernelCore& kernel, ResetType reset_type, std::string name = "Unknown"); | 33 | std::string name = "Unknown"); |
| 28 | |||
| 29 | /** | ||
| 30 | * Creates an event and registers it in the kernel's named event table | ||
| 31 | * @param kernel The kernel instance to create this event under. | ||
| 32 | * @param reset_type ResetType describing how to create event | ||
| 33 | * @param name name of event | ||
| 34 | */ | ||
| 35 | static SharedPtr<WritableEvent> CreateRegisteredEventPair(KernelCore& kernel, | ||
| 36 | ResetType reset_type, | ||
| 37 | std::string name); | ||
| 38 | 34 | ||
| 39 | std::string GetTypeName() const override { | 35 | std::string GetTypeName() const override { |
| 40 | return "WritableEvent"; | 36 | return "WritableEvent"; |
| @@ -48,27 +44,17 @@ public: | |||
| 48 | return HANDLE_TYPE; | 44 | return HANDLE_TYPE; |
| 49 | } | 45 | } |
| 50 | 46 | ||
| 51 | ResetType GetResetType() const { | 47 | ResetType GetResetType() const; |
| 52 | return reset_type; | ||
| 53 | } | ||
| 54 | |||
| 55 | bool ShouldWait(Thread* thread) const override; | ||
| 56 | void Acquire(Thread* thread) override; | ||
| 57 | |||
| 58 | void WakeupAllWaitingThreads() override; | ||
| 59 | 48 | ||
| 60 | void Signal(); | 49 | void Signal(); |
| 61 | void Clear(); | 50 | void Clear(); |
| 62 | void ResetOnAcquire(); | ||
| 63 | void ResetOnWakeup(); | ||
| 64 | bool IsSignaled() const; | 51 | bool IsSignaled() const; |
| 65 | 52 | ||
| 66 | private: | 53 | private: |
| 67 | explicit WritableEvent(KernelCore& kernel); | 54 | explicit WritableEvent(KernelCore& kernel); |
| 68 | 55 | ||
| 69 | ResetType reset_type; ///< Current ResetType | 56 | SharedPtr<ReadableEvent> readable; |
| 70 | 57 | ||
| 71 | bool signaled; ///< Whether the event has already been signaled | ||
| 72 | std::string name; ///< Name of event (optional) | 58 | std::string name; ///< Name of event (optional) |
| 73 | }; | 59 | }; |
| 74 | 60 | ||
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 43c91e521..a3e0df9bf 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -210,8 +210,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger | |||
| 210 | RegisterHandlers(functions); | 210 | RegisterHandlers(functions); |
| 211 | 211 | ||
| 212 | auto& kernel = Core::System::GetInstance().Kernel(); | 212 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 213 | launchable_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 213 | launchable_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 214 | kernel, Kernel::ResetType::Sticky, "ISelfController:LaunchableEvent"); | 214 | "ISelfController:LaunchableEvent"); |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | ISelfController::~ISelfController() = default; | 217 | ISelfController::~ISelfController() = default; |
| @@ -297,11 +297,11 @@ void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) { | |||
| 297 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | 297 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { |
| 298 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 298 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| 299 | 299 | ||
| 300 | launchable_event->Signal(); | 300 | launchable_event.writable->Signal(); |
| 301 | 301 | ||
| 302 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 302 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 303 | rb.Push(RESULT_SUCCESS); | 303 | rb.Push(RESULT_SUCCESS); |
| 304 | rb.PushCopyObjects(event->second); | 304 | rb.PushCopyObjects(launchable_event.readable); |
| 305 | 305 | ||
| 306 | void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { | 306 | void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { |
| 307 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 307 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| @@ -349,9 +349,9 @@ void ISelfController::GetIdleTimeDetectionExtension(Kernel::HLERequestContext& c | |||
| 349 | 349 | ||
| 350 | AppletMessageQueue::AppletMessageQueue() { | 350 | AppletMessageQueue::AppletMessageQueue() { |
| 351 | auto& kernel = Core::System::GetInstance().Kernel(); | 351 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 352 | on_new_message = Kernel::WritableEvent::CreateRegisteredEventPair( | 352 | on_new_message = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 353 | kernel, Kernel::ResetType::Sticky, "AMMessageQueue:OnMessageRecieved"); | 353 | "AMMessageQueue:OnMessageRecieved"); |
| 354 | on_operation_mode_changed = Kernel::WritableEvent::CreateRegisteredEventPair( | 354 | on_operation_mode_changed = Kernel::WritableEvent::CreateEventPair( |
| 355 | kernel, Kernel::ResetType::OneShot, "AMMessageQueue:OperationModeChanged"); | 355 | kernel, Kernel::ResetType::OneShot, "AMMessageQueue:OperationModeChanged"); |
| 356 | } | 356 | } |
| 357 | 357 | ||
| @@ -359,32 +359,28 @@ AppletMessageQueue::~AppletMessageQueue() = default; | |||
| 359 | 359 | ||
| 360 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent() | 360 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent() |
| 361 | const { | 361 | const { |
| 362 | const auto& event{ | 362 | return on_new_message.readable; |
| 363 | Core::System::GetInstance().Kernel().FindNamedEvent("AMMessageQueue:OnMessageRecieved")}; | ||
| 364 | return event->second; | ||
| 365 | } | 363 | } |
| 366 | 364 | ||
| 367 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() | 365 | const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() |
| 368 | const { | 366 | const { |
| 369 | const auto& event{ | 367 | return on_operation_mode_changed.readable; |
| 370 | Core::System::GetInstance().Kernel().FindNamedEvent("AMMessageQueue:OperationModeChanged")}; | ||
| 371 | return event->second; | ||
| 372 | } | 368 | } |
| 373 | 369 | ||
| 374 | void AppletMessageQueue::PushMessage(AppletMessage msg) { | 370 | void AppletMessageQueue::PushMessage(AppletMessage msg) { |
| 375 | messages.push(msg); | 371 | messages.push(msg); |
| 376 | on_new_message->Signal(); | 372 | on_new_message.writable->Signal(); |
| 377 | } | 373 | } |
| 378 | 374 | ||
| 379 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | 375 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { |
| 380 | if (messages.empty()) { | 376 | if (messages.empty()) { |
| 381 | on_new_message->Clear(); | 377 | on_new_message.writable->Clear(); |
| 382 | return AppletMessage::NoMessage; | 378 | return AppletMessage::NoMessage; |
| 383 | } | 379 | } |
| 384 | auto msg = messages.front(); | 380 | auto msg = messages.front(); |
| 385 | messages.pop(); | 381 | messages.pop(); |
| 386 | if (messages.empty()) { | 382 | if (messages.empty()) { |
| 387 | on_new_message->Clear(); | 383 | on_new_message.writable->Clear(); |
| 388 | } | 384 | } |
| 389 | return msg; | 385 | return msg; |
| 390 | } | 386 | } |
| @@ -396,7 +392,7 @@ std::size_t AppletMessageQueue::GetMessageCount() const { | |||
| 396 | void AppletMessageQueue::OperationModeChanged() { | 392 | void AppletMessageQueue::OperationModeChanged() { |
| 397 | PushMessage(AppletMessage::OperationModeChanged); | 393 | PushMessage(AppletMessage::OperationModeChanged); |
| 398 | PushMessage(AppletMessage::PerformanceModeChanged); | 394 | PushMessage(AppletMessage::PerformanceModeChanged); |
| 399 | on_operation_mode_changed->Signal(); | 395 | on_operation_mode_changed.writable->Signal(); |
| 400 | } | 396 | } |
| 401 | 397 | ||
| 402 | ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) | 398 | ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) |
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index ef90b0702..34c45fadf 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -6,13 +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 ReadableEvent; | ||
| 13 | class WritableEvent; | ||
| 14 | } // namespace Kernel | ||
| 15 | |||
| 16 | namespace Service { | 12 | namespace Service { |
| 17 | namespace NVFlinger { | 13 | namespace NVFlinger { |
| 18 | class NVFlinger; | 14 | class NVFlinger; |
| @@ -62,8 +58,8 @@ public: | |||
| 62 | 58 | ||
| 63 | private: | 59 | private: |
| 64 | std::queue<AppletMessage> messages; | 60 | std::queue<AppletMessage> messages; |
| 65 | Kernel::SharedPtr<Kernel::WritableEvent> on_new_message; | 61 | Kernel::EventPair on_new_message; |
| 66 | Kernel::SharedPtr<Kernel::WritableEvent> on_operation_mode_changed; | 62 | Kernel::EventPair on_operation_mode_changed; |
| 67 | }; | 63 | }; |
| 68 | 64 | ||
| 69 | class IWindowController final : public ServiceFramework<IWindowController> { | 65 | class IWindowController final : public ServiceFramework<IWindowController> { |
| @@ -123,7 +119,7 @@ private: | |||
| 123 | void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); | 119 | void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx); |
| 124 | 120 | ||
| 125 | std::shared_ptr<NVFlinger::NVFlinger> nvflinger; | 121 | std::shared_ptr<NVFlinger::NVFlinger> nvflinger; |
| 126 | Kernel::SharedPtr<Kernel::WritableEvent> launchable_event; | 122 | Kernel::EventPair launchable_event; |
| 127 | u32 idle_time_detection_extension = 0; | 123 | u32 idle_time_detection_extension = 0; |
| 128 | }; | 124 | }; |
| 129 | 125 | ||
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index 494205322..47da35537 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp | |||
| @@ -15,11 +15,11 @@ namespace Service::AM::Applets { | |||
| 15 | 15 | ||
| 16 | AppletDataBroker::AppletDataBroker() { | 16 | AppletDataBroker::AppletDataBroker() { |
| 17 | auto& kernel = Core::System::GetInstance().Kernel(); | 17 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 18 | state_changed_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 18 | state_changed_event = Kernel::WritableEvent::CreateEventPair( |
| 19 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:StateChangedEvent"); | 19 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:StateChangedEvent"); |
| 20 | pop_out_data_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 20 | pop_out_data_event = Kernel::WritableEvent::CreateEventPair( |
| 21 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopDataOutEvent"); | 21 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopDataOutEvent"); |
| 22 | pop_interactive_out_data_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 22 | pop_interactive_out_data_event = Kernel::WritableEvent::CreateEventPair( |
| 23 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | 23 | kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| @@ -67,7 +67,7 @@ void AppletDataBroker::PushNormalDataFromGame(IStorage storage) { | |||
| 67 | 67 | ||
| 68 | void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { | 68 | void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { |
| 69 | out_channel.push(std::make_unique<IStorage>(storage)); | 69 | out_channel.push(std::make_unique<IStorage>(storage)); |
| 70 | pop_out_data_event->Signal(); | 70 | pop_out_data_event.writable->Signal(); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | 73 | void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { |
| @@ -76,29 +76,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { | |||
| 76 | 76 | ||
| 77 | void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { | 77 | void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { |
| 78 | out_interactive_channel.push(std::make_unique<IStorage>(storage)); | 78 | out_interactive_channel.push(std::make_unique<IStorage>(storage)); |
| 79 | pop_interactive_out_data_event->Signal(); | 79 | pop_interactive_out_data_event.writable->Signal(); |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | void AppletDataBroker::SignalStateChanged() const { | 82 | void AppletDataBroker::SignalStateChanged() const { |
| 83 | state_changed_event->Signal(); | 83 | state_changed_event.writable->Signal(); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const { | 86 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const { |
| 87 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent( | 87 | return pop_out_data_event.readable; |
| 88 | "ILibraryAppletAccessor:PopDataOutEvent")}; | ||
| 89 | return event->second; | ||
| 90 | } | 88 | } |
| 91 | 89 | ||
| 92 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { | 90 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { |
| 93 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent( | 91 | return pop_interactive_out_data_event.readable; |
| 94 | "ILibraryAppletAccessor:PopInteractiveDataOutEvent")}; | ||
| 95 | return event->second; | ||
| 96 | } | 92 | } |
| 97 | 93 | ||
| 98 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const { | 94 | Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const { |
| 99 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent( | 95 | return state_changed_event.readable; |
| 100 | "ILibraryAppletAccessor:StateChangedEvent")}; | ||
| 101 | return event->second; | ||
| 102 | } | 96 | } |
| 103 | 97 | ||
| 104 | 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 5cd6232cc..3eff471eb 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -60,13 +60,13 @@ private: | |||
| 60 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet | 60 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet |
| 61 | std::queue<std::unique_ptr<IStorage>> out_interactive_channel; | 61 | std::queue<std::unique_ptr<IStorage>> out_interactive_channel; |
| 62 | 62 | ||
| 63 | Kernel::SharedPtr<Kernel::WritableEvent> state_changed_event; | 63 | Kernel::EventPair state_changed_event; |
| 64 | 64 | ||
| 65 | // Signaled on PushNormalDataFromApplet | 65 | // Signaled on PushNormalDataFromApplet |
| 66 | Kernel::SharedPtr<Kernel::WritableEvent> pop_out_data_event; | 66 | Kernel::EventPair pop_out_data_event; |
| 67 | 67 | ||
| 68 | // Signaled on PushInteractiveDataFromApplet | 68 | // Signaled on PushInteractiveDataFromApplet |
| 69 | Kernel::SharedPtr<Kernel::WritableEvent> pop_interactive_out_data_event; | 69 | Kernel::EventPair pop_interactive_out_data_event; |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
| 72 | class Applet { | 72 | class Applet { |
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index a89f99dc7..b276de332 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp | |||
| @@ -63,8 +63,8 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs | |||
| 63 | RegisterHandlers(functions); | 63 | RegisterHandlers(functions); |
| 64 | 64 | ||
| 65 | auto& kernel = Core::System::GetInstance().Kernel(); | 65 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 66 | aoc_change_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 66 | aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 67 | kernel, Kernel::ResetType::Sticky, "GetAddOnContentListChanged:Event"); | 67 | "GetAddOnContentListChanged:Event"); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | AOC_U::~AOC_U() = default; | 70 | AOC_U::~AOC_U() = default; |
| @@ -144,12 +144,9 @@ void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) { | |||
| 144 | void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | 144 | void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { |
| 145 | LOG_WARNING(Service_AOC, "(STUBBED) called"); | 145 | LOG_WARNING(Service_AOC, "(STUBBED) called"); |
| 146 | 146 | ||
| 147 | const auto& event{ | ||
| 148 | Core::System::GetInstance().Kernel().FindNamedEvent("GetAddOnContentListChanged:Event")}; | ||
| 149 | |||
| 150 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 147 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 151 | rb.Push(RESULT_SUCCESS); | 148 | rb.Push(RESULT_SUCCESS); |
| 152 | rb.PushCopyObjects(event->second); | 149 | rb.PushCopyObjects(aoc_change_event.readable); |
| 153 | } | 150 | } |
| 154 | 151 | ||
| 155 | 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 f32a757aa..5effea730 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h | |||
| @@ -25,7 +25,7 @@ private: | |||
| 25 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); | 25 | void GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx); |
| 26 | 26 | ||
| 27 | std::vector<u64> add_on_content; | 27 | std::vector<u64> add_on_content; |
| 28 | Kernel::SharedPtr<Kernel::WritableEvent> aoc_change_event; | 28 | Kernel::EventPair aoc_change_event; |
| 29 | }; | 29 | }; |
| 30 | 30 | ||
| 31 | /// 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 b5012e579..22e5c85ab 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp | |||
| @@ -69,11 +69,12 @@ public: | |||
| 69 | 69 | ||
| 70 | // 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 |
| 71 | auto& kernel = Core::System::GetInstance().Kernel(); | 71 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 72 | buffer_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 72 | buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 73 | kernel, Kernel::ResetType::Sticky, "IAudioOutBufferReleased"); | 73 | "IAudioOutBufferReleased"); |
| 74 | 74 | ||
| 75 | 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, |
| 76 | std::move(unique_name), [=]() { buffer_event->Signal(); }); | 76 | std::move(unique_name), |
| 77 | [=]() { buffer_event.writable->Signal(); }); | ||
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | private: | 80 | private: |
| @@ -123,9 +124,7 @@ private: | |||
| 123 | 124 | ||
| 124 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 125 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 125 | rb.Push(RESULT_SUCCESS); | 126 | rb.Push(RESULT_SUCCESS); |
| 126 | const auto& event{ | 127 | rb.PushCopyObjects(buffer_event.readable); |
| 127 | Core::System::GetInstance().Kernel().FindNamedEvent("IAudioOutBufferReleased")}; | ||
| 128 | rb.PushCopyObjects(event->second); | ||
| 129 | } | 128 | } |
| 130 | 129 | ||
| 131 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { | 130 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { |
| @@ -191,8 +190,8 @@ private: | |||
| 191 | 190 | ||
| 192 | AudoutParams audio_params{}; | 191 | AudoutParams audio_params{}; |
| 193 | 192 | ||
| 194 | /// 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 |
| 195 | Kernel::SharedPtr<Kernel::WritableEvent> buffer_event; | 194 | Kernel::EventPair buffer_event; |
| 196 | }; | 195 | }; |
| 197 | 196 | ||
| 198 | 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 9b7f7b201..945259c7d 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -43,14 +43,14 @@ public: | |||
| 43 | RegisterHandlers(functions); | 43 | RegisterHandlers(functions); |
| 44 | 44 | ||
| 45 | auto& kernel = Core::System::GetInstance().Kernel(); | 45 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 46 | system_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 46 | system_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 47 | kernel, Kernel::ResetType::Sticky, "IAudioRenderer:SystemEvent"); | 47 | "IAudioRenderer:SystemEvent"); |
| 48 | renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event); | 48 | renderer = std::make_unique<AudioCore::AudioRenderer>(audren_params, system_event.writable); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | private: | 51 | private: |
| 52 | void UpdateAudioCallback() { | 52 | void UpdateAudioCallback() { |
| 53 | system_event->Signal(); | 53 | system_event.writable->Signal(); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | void GetSampleRate(Kernel::HLERequestContext& ctx) { | 56 | void GetSampleRate(Kernel::HLERequestContext& ctx) { |
| @@ -114,9 +114,7 @@ private: | |||
| 114 | 114 | ||
| 115 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 115 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 116 | rb.Push(RESULT_SUCCESS); | 116 | rb.Push(RESULT_SUCCESS); |
| 117 | const auto& event{ | 117 | rb.PushCopyObjects(system_event.readable); |
| 118 | Core::System::GetInstance().Kernel().FindNamedEvent("IAudioRenderer:SystemEvent")}; | ||
| 119 | rb.PushCopyObjects(event->second); | ||
| 120 | } | 118 | } |
| 121 | 119 | ||
| 122 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { | 120 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { |
| @@ -139,7 +137,7 @@ private: | |||
| 139 | rb.Push(rendering_time_limit_percent); | 137 | rb.Push(rendering_time_limit_percent); |
| 140 | } | 138 | } |
| 141 | 139 | ||
| 142 | Kernel::SharedPtr<Kernel::WritableEvent> system_event; | 140 | Kernel::EventPair system_event; |
| 143 | std::unique_ptr<AudioCore::AudioRenderer> renderer; | 141 | std::unique_ptr<AudioCore::AudioRenderer> renderer; |
| 144 | u32 rendering_time_limit_percent = 100; | 142 | u32 rendering_time_limit_percent = 100; |
| 145 | }; | 143 | }; |
| @@ -166,8 +164,8 @@ public: | |||
| 166 | RegisterHandlers(functions); | 164 | RegisterHandlers(functions); |
| 167 | 165 | ||
| 168 | auto& kernel = Core::System::GetInstance().Kernel(); | 166 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 169 | buffer_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 167 | buffer_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 170 | kernel, Kernel::ResetType::OneShot, "IAudioOutBufferReleasedEvent"); | 168 | "IAudioOutBufferReleasedEvent"); |
| 171 | } | 169 | } |
| 172 | 170 | ||
| 173 | private: | 171 | private: |
| @@ -211,13 +209,11 @@ private: | |||
| 211 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { | 209 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { |
| 212 | LOG_WARNING(Service_Audio, "(STUBBED) called"); | 210 | LOG_WARNING(Service_Audio, "(STUBBED) called"); |
| 213 | 211 | ||
| 214 | buffer_event->Signal(); | 212 | buffer_event.writable->Signal(); |
| 215 | 213 | ||
| 216 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 214 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 217 | rb.Push(RESULT_SUCCESS); | 215 | rb.Push(RESULT_SUCCESS); |
| 218 | const auto& event{ | 216 | rb.PushCopyObjects(buffer_event.readable); |
| 219 | Core::System::GetInstance().Kernel().FindNamedEvent("IAudioOutBufferReleasedEvent")}; | ||
| 220 | rb.PushCopyObjects(event->second); | ||
| 221 | } | 217 | } |
| 222 | 218 | ||
| 223 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { | 219 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { |
| @@ -228,7 +224,7 @@ private: | |||
| 228 | rb.Push<u32>(1); | 224 | rb.Push<u32>(1); |
| 229 | } | 225 | } |
| 230 | 226 | ||
| 231 | Kernel::SharedPtr<Kernel::WritableEvent> buffer_event; | 227 | Kernel::EventPair buffer_event; |
| 232 | 228 | ||
| 233 | }; // namespace Audio | 229 | }; // namespace Audio |
| 234 | 230 | ||
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 04c78e81a..5704ca0ab 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp | |||
| @@ -34,8 +34,8 @@ public: | |||
| 34 | RegisterHandlers(functions); | 34 | RegisterHandlers(functions); |
| 35 | 35 | ||
| 36 | auto& kernel = Core::System::GetInstance().Kernel(); | 36 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 37 | register_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 37 | register_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 38 | kernel, Kernel::ResetType::OneShot, "BT:RegisterEvent"); | 38 | "BT:RegisterEvent"); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | private: | 41 | private: |
| @@ -44,10 +44,10 @@ private: | |||
| 44 | 44 | ||
| 45 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 45 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 46 | rb.Push(RESULT_SUCCESS); | 46 | rb.Push(RESULT_SUCCESS); |
| 47 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("BT:RegisterEvent")}; | 47 | rb.PushCopyObjects(register_event.readable); |
| 48 | rb.PushCopyObjects(event->second); | ||
| 49 | } | 48 | } |
| 50 | Kernel::SharedPtr<Kernel::WritableEvent> register_event; | 49 | |
| 50 | Kernel::EventPair register_event; | ||
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | 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 3ee298161..ef7398a23 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp | |||
| @@ -57,14 +57,14 @@ public: | |||
| 57 | RegisterHandlers(functions); | 57 | RegisterHandlers(functions); |
| 58 | 58 | ||
| 59 | auto& kernel = Core::System::GetInstance().Kernel(); | 59 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 60 | scan_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 60 | scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 61 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ScanEvent"); | 61 | "IBtmUserCore:ScanEvent"); |
| 62 | connection_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 62 | connection_event = Kernel::WritableEvent::CreateEventPair( |
| 63 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConnectionEvent"); | 63 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConnectionEvent"); |
| 64 | service_discovery = Kernel::WritableEvent::CreateRegisteredEventPair( | 64 | service_discovery = Kernel::WritableEvent::CreateEventPair( |
| 65 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); | 65 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); |
| 66 | config_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 66 | config_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 67 | kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConfigEvent"); | 67 | "IBtmUserCore:ConfigEvent"); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | private: | 70 | private: |
| @@ -73,46 +73,37 @@ private: | |||
| 73 | 73 | ||
| 74 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 74 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 75 | rb.Push(RESULT_SUCCESS); | 75 | rb.Push(RESULT_SUCCESS); |
| 76 | 76 | rb.PushCopyObjects(scan_event.readable); | |
| 77 | const auto& event{ | ||
| 78 | Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ScanEvent")}; | ||
| 79 | rb.PushCopyObjects(event->second); | ||
| 80 | } | 77 | } |
| 78 | |||
| 81 | void GetConnectionEvent(Kernel::HLERequestContext& ctx) { | 79 | void GetConnectionEvent(Kernel::HLERequestContext& ctx) { |
| 82 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 80 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 83 | 81 | ||
| 84 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 82 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 85 | rb.Push(RESULT_SUCCESS); | 83 | rb.Push(RESULT_SUCCESS); |
| 86 | 84 | rb.PushCopyObjects(connection_event.readable); | |
| 87 | const auto& event{ | ||
| 88 | Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ConnectionEvent")}; | ||
| 89 | rb.PushCopyObjects(event->second); | ||
| 90 | } | 85 | } |
| 86 | |||
| 91 | void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { | 87 | void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { |
| 92 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 88 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 93 | 89 | ||
| 94 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 90 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 95 | rb.Push(RESULT_SUCCESS); | 91 | rb.Push(RESULT_SUCCESS); |
| 96 | 92 | rb.PushCopyObjects(service_discovery.readable); | |
| 97 | const auto& event{ | ||
| 98 | Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:Discovery")}; | ||
| 99 | rb.PushCopyObjects(event->second); | ||
| 100 | } | 93 | } |
| 94 | |||
| 101 | void GetConfigEvent(Kernel::HLERequestContext& ctx) { | 95 | void GetConfigEvent(Kernel::HLERequestContext& ctx) { |
| 102 | LOG_WARNING(Service_BTM, "(STUBBED) called"); | 96 | LOG_WARNING(Service_BTM, "(STUBBED) called"); |
| 103 | 97 | ||
| 104 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 98 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 105 | rb.Push(RESULT_SUCCESS); | 99 | rb.Push(RESULT_SUCCESS); |
| 106 | 100 | rb.PushCopyObjects(config_event.readable); | |
| 107 | const auto& event{ | ||
| 108 | Core::System::GetInstance().Kernel().FindNamedEvent("IBtmUserCore:ConfigEvent")}; | ||
| 109 | rb.PushCopyObjects(event->second); | ||
| 110 | } | 101 | } |
| 111 | 102 | ||
| 112 | Kernel::SharedPtr<Kernel::WritableEvent> scan_event; | 103 | Kernel::EventPair scan_event; |
| 113 | Kernel::SharedPtr<Kernel::WritableEvent> connection_event; | 104 | Kernel::EventPair connection_event; |
| 114 | Kernel::SharedPtr<Kernel::WritableEvent> service_discovery; | 105 | Kernel::EventPair service_discovery; |
| 115 | Kernel::SharedPtr<Kernel::WritableEvent> config_event; | 106 | Kernel::EventPair config_event; |
| 116 | }; | 107 | }; |
| 117 | 108 | ||
| 118 | 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 df39a6dc4..342c2eb81 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -169,7 +169,7 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | |||
| 169 | 169 | ||
| 170 | void Controller_NPad::OnInit() { | 170 | void Controller_NPad::OnInit() { |
| 171 | auto& kernel = Core::System::GetInstance().Kernel(); | 171 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 172 | styleset_changed_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 172 | styleset_changed_event = Kernel::WritableEvent::CreateEventPair( |
| 173 | kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); | 173 | kernel, Kernel::ResetType::OneShot, "npad:NpadStyleSetChanged"); |
| 174 | 174 | ||
| 175 | if (!IsControllerActivated()) { | 175 | if (!IsControllerActivated()) { |
| @@ -496,7 +496,7 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | |||
| 496 | had_controller_update = true; | 496 | had_controller_update = true; |
| 497 | } | 497 | } |
| 498 | if (had_controller_update) { | 498 | if (had_controller_update) { |
| 499 | styleset_changed_event->Signal(); | 499 | styleset_changed_event.writable->Signal(); |
| 500 | } | 500 | } |
| 501 | } | 501 | } |
| 502 | } | 502 | } |
| @@ -511,7 +511,7 @@ std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const { | |||
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { | 513 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { |
| 514 | styleset_changed_event->Signal(); | 514 | styleset_changed_event.writable->Signal(); |
| 515 | hold_type = joy_hold_type; | 515 | hold_type = joy_hold_type; |
| 516 | } | 516 | } |
| 517 | 517 | ||
| @@ -543,10 +543,8 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | |||
| 543 | Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { | 543 | Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { |
| 544 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should | 544 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should |
| 545 | // be signalled at least once, and signaled after a new controller is connected? | 545 | // be signalled at least once, and signaled after a new controller is connected? |
| 546 | styleset_changed_event->Signal(); | 546 | styleset_changed_event.writable->Signal(); |
| 547 | const auto& event{ | 547 | return styleset_changed_event.readable; |
| 548 | Core::System::GetInstance().Kernel().FindNamedEvent("npad:NpadStyleSetChanged")}; | ||
| 549 | return event->second; | ||
| 550 | } | 548 | } |
| 551 | 549 | ||
| 552 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | 550 | 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 c960d0f57..29851f16a 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -9,14 +9,10 @@ | |||
| 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/object.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 | ||
| 15 | namespace Kernel { | ||
| 16 | class ReadableEvent; | ||
| 17 | class WritableEvent; | ||
| 18 | } // namespace Kernel | ||
| 19 | |||
| 20 | namespace Service::HID { | 16 | namespace Service::HID { |
| 21 | 17 | ||
| 22 | constexpr u32 NPAD_HANDHELD = 32; | 18 | constexpr u32 NPAD_HANDHELD = 32; |
| @@ -308,7 +304,7 @@ private: | |||
| 308 | sticks; | 304 | sticks; |
| 309 | std::vector<u32> supported_npad_id_types{}; | 305 | std::vector<u32> supported_npad_id_types{}; |
| 310 | NpadHoldType hold_type{NpadHoldType::Vertical}; | 306 | NpadHoldType hold_type{NpadHoldType::Vertical}; |
| 311 | Kernel::SharedPtr<Kernel::WritableEvent> styleset_changed_event; | 307 | Kernel::EventPair styleset_changed_event; |
| 312 | Vibration last_processed_vibration{}; | 308 | Vibration last_processed_vibration{}; |
| 313 | std::array<ControllerHolder, 10> connected_controllers{}; | 309 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 314 | bool can_controllers_vibrate{true}; | 310 | bool can_controllers_vibrate{true}; |
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index 75c605364..d5df112a0 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp | |||
| @@ -25,8 +25,8 @@ constexpr ResultCode ERR_TAG_FAILED(ErrorModule::NFP, | |||
| 25 | Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) | 25 | Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) |
| 26 | : ServiceFramework(name), module(std::move(module)) { | 26 | : ServiceFramework(name), module(std::move(module)) { |
| 27 | auto& kernel = Core::System::GetInstance().Kernel(); | 27 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 28 | nfc_tag_load = Kernel::WritableEvent::CreateRegisteredEventPair( | 28 | nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 29 | kernel, Kernel::ResetType::OneShot, "IUser:NFCTagDetected"); | 29 | "IUser:NFCTagDetected"); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | Module::Interface::~Interface() = default; | 32 | Module::Interface::~Interface() = default; |
| @@ -65,9 +65,9 @@ public: | |||
| 65 | RegisterHandlers(functions); | 65 | RegisterHandlers(functions); |
| 66 | 66 | ||
| 67 | auto& kernel = Core::System::GetInstance().Kernel(); | 67 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 68 | deactivate_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 68 | deactivate_event = Kernel::WritableEvent::CreateEventPair( |
| 69 | kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); | 69 | kernel, Kernel::ResetType::OneShot, "IUser:DeactivateEvent"); |
| 70 | availability_change_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 70 | availability_change_event = Kernel::WritableEvent::CreateEventPair( |
| 71 | kernel, Kernel::ResetType::OneShot, "IUser:AvailabilityChangeEvent"); | 71 | kernel, Kernel::ResetType::OneShot, "IUser:AvailabilityChangeEvent"); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| @@ -166,10 +166,7 @@ private: | |||
| 166 | 166 | ||
| 167 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 167 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 168 | rb.Push(RESULT_SUCCESS); | 168 | rb.Push(RESULT_SUCCESS); |
| 169 | 169 | rb.PushCopyObjects(deactivate_event.readable); | |
| 170 | const auto& event{ | ||
| 171 | Core::System::GetInstance().Kernel().FindNamedEvent("IUser:DeactivateEvent")}; | ||
| 172 | rb.PushCopyObjects(event->second); | ||
| 173 | } | 170 | } |
| 174 | 171 | ||
| 175 | void StopDetection(Kernel::HLERequestContext& ctx) { | 172 | void StopDetection(Kernel::HLERequestContext& ctx) { |
| @@ -178,7 +175,7 @@ private: | |||
| 178 | switch (device_state) { | 175 | switch (device_state) { |
| 179 | case DeviceState::TagFound: | 176 | case DeviceState::TagFound: |
| 180 | case DeviceState::TagNearby: | 177 | case DeviceState::TagNearby: |
| 181 | deactivate_event->Signal(); | 178 | deactivate_event.writable->Signal(); |
| 182 | device_state = DeviceState::Initialized; | 179 | device_state = DeviceState::Initialized; |
| 183 | break; | 180 | break; |
| 184 | case DeviceState::SearchingForTag: | 181 | case DeviceState::SearchingForTag: |
| @@ -269,9 +266,7 @@ private: | |||
| 269 | 266 | ||
| 270 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 267 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 271 | rb.Push(RESULT_SUCCESS); | 268 | rb.Push(RESULT_SUCCESS); |
| 272 | const auto& event{ | 269 | rb.PushCopyObjects(availability_change_event.readable); |
| 273 | Core::System::GetInstance().Kernel().FindNamedEvent("IUser:AvailabilityChangeEvent")}; | ||
| 274 | rb.PushCopyObjects(event->second); | ||
| 275 | } | 270 | } |
| 276 | 271 | ||
| 277 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { | 272 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { |
| @@ -326,8 +321,8 @@ private: | |||
| 326 | const u32 npad_id{0}; // Player 1 controller | 321 | const u32 npad_id{0}; // Player 1 controller |
| 327 | State state{State::NonInitialized}; | 322 | State state{State::NonInitialized}; |
| 328 | DeviceState device_state{DeviceState::Initialized}; | 323 | DeviceState device_state{DeviceState::Initialized}; |
| 329 | Kernel::SharedPtr<Kernel::WritableEvent> deactivate_event; | 324 | Kernel::EventPair deactivate_event; |
| 330 | Kernel::SharedPtr<Kernel::WritableEvent> availability_change_event; | 325 | Kernel::EventPair availability_change_event; |
| 331 | const Module::Interface& nfp_interface; | 326 | const Module::Interface& nfp_interface; |
| 332 | }; | 327 | }; |
| 333 | 328 | ||
| @@ -346,14 +341,14 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | |||
| 346 | } | 341 | } |
| 347 | 342 | ||
| 348 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); | 343 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); |
| 349 | nfc_tag_load->Signal(); | 344 | nfc_tag_load.writable->Signal(); |
| 350 | return true; | 345 | return true; |
| 351 | } | 346 | } |
| 352 | 347 | ||
| 353 | const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const { | 348 | const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const { |
| 354 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("IUser:NFCTagDetected")}; | 349 | return nfc_tag_load.readable; |
| 355 | return event->second; | ||
| 356 | } | 350 | } |
| 351 | |||
| 357 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { | 352 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { |
| 358 | return amiibo; | 353 | return amiibo; |
| 359 | } | 354 | } |
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index 0ab1ca997..437c10aad 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h | |||
| @@ -6,13 +6,9 @@ | |||
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <vector> | 8 | #include <vector> |
| 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 ReadableEvent; | ||
| 13 | class WritableEvent; | ||
| 14 | } // namespace Kernel | ||
| 15 | |||
| 16 | namespace Service::NFP { | 12 | namespace Service::NFP { |
| 17 | 13 | ||
| 18 | class Module final { | 14 | class Module final { |
| @@ -41,7 +37,7 @@ public: | |||
| 41 | const AmiiboFile& GetAmiiboBuffer() const; | 37 | const AmiiboFile& GetAmiiboBuffer() const; |
| 42 | 38 | ||
| 43 | private: | 39 | private: |
| 44 | Kernel::SharedPtr<Kernel::WritableEvent> nfc_tag_load{}; | 40 | Kernel::EventPair nfc_tag_load{}; |
| 45 | AmiiboFile amiibo{}; | 41 | AmiiboFile amiibo{}; |
| 46 | 42 | ||
| 47 | protected: | 43 | protected: |
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 80a66bce3..60479bb45 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp | |||
| @@ -58,10 +58,10 @@ public: | |||
| 58 | RegisterHandlers(functions); | 58 | RegisterHandlers(functions); |
| 59 | 59 | ||
| 60 | auto& kernel = Core::System::GetInstance().Kernel(); | 60 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 61 | event1 = Kernel::WritableEvent::CreateRegisteredEventPair( | 61 | event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 62 | kernel, Kernel::ResetType::OneShot, "IRequest:Event1"); | 62 | "IRequest:Event1"); |
| 63 | event2 = Kernel::WritableEvent::CreateRegisteredEventPair( | 63 | event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 64 | kernel, Kernel::ResetType::OneShot, "IRequest:Event2"); | 64 | "IRequest:Event2"); |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | private: | 67 | private: |
| @@ -92,11 +92,7 @@ private: | |||
| 92 | 92 | ||
| 93 | IPC::ResponseBuilder rb{ctx, 2, 2}; | 93 | IPC::ResponseBuilder rb{ctx, 2, 2}; |
| 94 | rb.Push(RESULT_SUCCESS); | 94 | rb.Push(RESULT_SUCCESS); |
| 95 | 95 | rb.PushCopyObjects(event1.readable, event2.readable); | |
| 96 | const auto& event1{Core::System::GetInstance().Kernel().FindNamedEvent("IRequest:Event1")}; | ||
| 97 | const auto& event2{Core::System::GetInstance().Kernel().FindNamedEvent("IRequest:Event2")}; | ||
| 98 | |||
| 99 | rb.PushCopyObjects(event1->second, event2->second); | ||
| 100 | } | 96 | } |
| 101 | 97 | ||
| 102 | void Cancel(Kernel::HLERequestContext& ctx) { | 98 | void Cancel(Kernel::HLERequestContext& ctx) { |
| @@ -113,7 +109,7 @@ private: | |||
| 113 | rb.Push(RESULT_SUCCESS); | 109 | rb.Push(RESULT_SUCCESS); |
| 114 | } | 110 | } |
| 115 | 111 | ||
| 116 | Kernel::SharedPtr<Kernel::WritableEvent> event1, event2; | 112 | Kernel::EventPair event1, event2; |
| 117 | }; | 113 | }; |
| 118 | 114 | ||
| 119 | 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 d181a781c..0dabcd23b 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp | |||
| @@ -140,19 +140,18 @@ public: | |||
| 140 | RegisterHandlers(functions); | 140 | RegisterHandlers(functions); |
| 141 | 141 | ||
| 142 | auto& kernel = Core::System::GetInstance().Kernel(); | 142 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 143 | finished_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 143 | finished_event = Kernel::WritableEvent::CreateEventPair( |
| 144 | kernel, Kernel::ResetType::OneShot, | 144 | kernel, Kernel::ResetType::OneShot, |
| 145 | "IEnsureNetworkClockAvailabilityService:FinishEvent"); | 145 | "IEnsureNetworkClockAvailabilityService:FinishEvent"); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | private: | 148 | private: |
| 149 | Kernel::SharedPtr<Kernel::WritableEvent> finished_event; | 149 | Kernel::EventPair finished_event; |
| 150 | 150 | ||
| 151 | void StartTask(Kernel::HLERequestContext& ctx) { | 151 | void StartTask(Kernel::HLERequestContext& ctx) { |
| 152 | // 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. |
| 153 | LOG_DEBUG(Service_NIM, "called"); | 153 | LOG_DEBUG(Service_NIM, "called"); |
| 154 | 154 | finished_event.writable->Signal(); | |
| 155 | finished_event->Signal(); | ||
| 156 | IPC::ResponseBuilder rb{ctx, 2}; | 155 | IPC::ResponseBuilder rb{ctx, 2}; |
| 157 | rb.Push(RESULT_SUCCESS); | 156 | rb.Push(RESULT_SUCCESS); |
| 158 | } | 157 | } |
| @@ -162,9 +161,7 @@ private: | |||
| 162 | 161 | ||
| 163 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 162 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 164 | rb.Push(RESULT_SUCCESS); | 163 | rb.Push(RESULT_SUCCESS); |
| 165 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent( | 164 | rb.PushCopyObjects(finished_event.readable); |
| 166 | "IEnsureNetworkClockAvailabilityService:FinishEvent")}; | ||
| 167 | rb.PushCopyObjects(event->second); | ||
| 168 | } | 165 | } |
| 169 | 166 | ||
| 170 | void GetResult(Kernel::HLERequestContext& ctx) { | 167 | void GetResult(Kernel::HLERequestContext& ctx) { |
| @@ -176,8 +173,7 @@ private: | |||
| 176 | 173 | ||
| 177 | void Cancel(Kernel::HLERequestContext& ctx) { | 174 | void Cancel(Kernel::HLERequestContext& ctx) { |
| 178 | LOG_DEBUG(Service_NIM, "called"); | 175 | LOG_DEBUG(Service_NIM, "called"); |
| 179 | 176 | finished_event.writable->Clear(); | |
| 180 | finished_event->Clear(); | ||
| 181 | IPC::ResponseBuilder rb{ctx, 2}; | 177 | IPC::ResponseBuilder rb{ctx, 2}; |
| 182 | rb.Push(RESULT_SUCCESS); | 178 | rb.Push(RESULT_SUCCESS); |
| 183 | } | 179 | } |
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp index 3d89b4020..3b9ab4b14 100644 --- a/src/core/hle/service/nvdrv/interface.cpp +++ b/src/core/hle/service/nvdrv/interface.cpp | |||
| @@ -71,9 +71,7 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) { | |||
| 71 | 71 | ||
| 72 | IPC::ResponseBuilder rb{ctx, 3, 1}; | 72 | IPC::ResponseBuilder rb{ctx, 3, 1}; |
| 73 | rb.Push(RESULT_SUCCESS); | 73 | rb.Push(RESULT_SUCCESS); |
| 74 | 74 | rb.PushCopyObjects(query_event.readable); | |
| 75 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent("NVDRV::query_event")}; | ||
| 76 | rb.PushCopyObjects(event->second); | ||
| 77 | rb.Push<u32>(0); | 75 | rb.Push<u32>(0); |
| 78 | } | 76 | } |
| 79 | 77 | ||
| @@ -131,8 +129,8 @@ NVDRV::NVDRV(std::shared_ptr<Module> nvdrv, const char* name) | |||
| 131 | RegisterHandlers(functions); | 129 | RegisterHandlers(functions); |
| 132 | 130 | ||
| 133 | auto& kernel = Core::System::GetInstance().Kernel(); | 131 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 134 | query_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 132 | query_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 135 | kernel, Kernel::ResetType::OneShot, "NVDRV::query_event"); | 133 | "NVDRV::query_event"); |
| 136 | } | 134 | } |
| 137 | 135 | ||
| 138 | 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 a27252038..fe311b069 100644 --- a/src/core/hle/service/nvdrv/interface.h +++ b/src/core/hle/service/nvdrv/interface.h | |||
| @@ -34,7 +34,7 @@ private: | |||
| 34 | 34 | ||
| 35 | u64 pid{}; | 35 | u64 pid{}; |
| 36 | 36 | ||
| 37 | Kernel::SharedPtr<Kernel::WritableEvent> query_event; | 37 | Kernel::EventPair query_event; |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | } // 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 7b07750b5..fc07d9bb8 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -16,8 +16,8 @@ namespace Service::NVFlinger { | |||
| 16 | 16 | ||
| 17 | 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) { |
| 18 | auto& kernel = Core::System::GetInstance().Kernel(); | 18 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 19 | buffer_wait_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 19 | buffer_wait_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky, |
| 20 | kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle"); | 20 | "BufferQueue NativeHandle"); |
| 21 | } | 21 | } |
| 22 | 22 | ||
| 23 | BufferQueue::~BufferQueue() = default; | 23 | BufferQueue::~BufferQueue() = default; |
| @@ -31,7 +31,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | |||
| 31 | buffer.status = Buffer::Status::Free; | 31 | buffer.status = Buffer::Status::Free; |
| 32 | 32 | ||
| 33 | queue.emplace_back(buffer); | 33 | queue.emplace_back(buffer); |
| 34 | buffer_wait_event->Signal(); | 34 | buffer_wait_event.writable->Signal(); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { | 37 | std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { |
| @@ -90,7 +90,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | |||
| 90 | ASSERT(itr->status == Buffer::Status::Acquired); | 90 | ASSERT(itr->status == Buffer::Status::Acquired); |
| 91 | itr->status = Buffer::Status::Free; | 91 | itr->status = Buffer::Status::Free; |
| 92 | 92 | ||
| 93 | buffer_wait_event->Signal(); | 93 | buffer_wait_event.writable->Signal(); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | u32 BufferQueue::Query(QueryType type) { | 96 | u32 BufferQueue::Query(QueryType type) { |
| @@ -108,13 +108,11 @@ u32 BufferQueue::Query(QueryType type) { | |||
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { | 110 | Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { |
| 111 | return buffer_wait_event; | 111 | return buffer_wait_event.writable; |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const { | 114 | Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const { |
| 115 | const auto& event{ | 115 | return buffer_wait_event.readable; |
| 116 | Core::System::GetInstance().Kernel().FindNamedEvent("BufferQueue NativeHandle")}; | ||
| 117 | return event->second; | ||
| 118 | } | 116 | } |
| 119 | 117 | ||
| 120 | } // 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 8b2a2b7de..b171f256c 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -11,16 +11,12 @@ | |||
| 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/object.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; |
| 17 | } | 18 | } |
| 18 | 19 | ||
| 19 | namespace Kernel { | ||
| 20 | class ReadableEvent; | ||
| 21 | class WritableEvent; | ||
| 22 | } // namespace Kernel | ||
| 23 | |||
| 24 | namespace Service::NVFlinger { | 20 | namespace Service::NVFlinger { |
| 25 | 21 | ||
| 26 | struct IGBPBuffer { | 22 | struct IGBPBuffer { |
| @@ -100,7 +96,7 @@ private: | |||
| 100 | u64 layer_id; | 96 | u64 layer_id; |
| 101 | 97 | ||
| 102 | std::vector<Buffer> queue; | 98 | std::vector<Buffer> queue; |
| 103 | Kernel::SharedPtr<Kernel::WritableEvent> buffer_wait_event; | 99 | Kernel::EventPair buffer_wait_event; |
| 104 | }; | 100 | }; |
| 105 | 101 | ||
| 106 | } // 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 2a329cb8e..05af2d593 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -87,9 +87,7 @@ u32 NVFlinger::GetBufferQueueId(u64 display_id, u64 layer_id) { | |||
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) { | 89 | Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) { |
| 90 | const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent( | 90 | return GetDisplay(display_id).vsync_event.readable; |
| 91 | fmt::format("Display VSync Event {}", display_id))}; | ||
| 92 | return event->second; | ||
| 93 | } | 91 | } |
| 94 | 92 | ||
| 95 | std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { | 93 | std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { |
| @@ -121,7 +119,7 @@ Layer& NVFlinger::GetLayer(u64 display_id, u64 layer_id) { | |||
| 121 | void NVFlinger::Compose() { | 119 | void NVFlinger::Compose() { |
| 122 | for (auto& display : displays) { | 120 | for (auto& display : displays) { |
| 123 | // Trigger vsync for this display at the end of drawing | 121 | // Trigger vsync for this display at the end of drawing |
| 124 | SCOPE_EXIT({ display.vsync_event->Signal(); }); | 122 | SCOPE_EXIT({ display.vsync_event.writable->Signal(); }); |
| 125 | 123 | ||
| 126 | // Don't do anything for displays without layers. | 124 | // Don't do anything for displays without layers. |
| 127 | if (display.layers.empty()) | 125 | if (display.layers.empty()) |
| @@ -168,8 +166,8 @@ Layer::~Layer() = default; | |||
| 168 | 166 | ||
| 169 | 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)) { |
| 170 | auto& kernel = Core::System::GetInstance().Kernel(); | 168 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 171 | vsync_event = Kernel::WritableEvent::CreateRegisteredEventPair( | 169 | vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Pulse, |
| 172 | kernel, Kernel::ResetType::Pulse, fmt::format("Display VSync Event {}", id)); | 170 | fmt::format("Display VSync Event {}", id)); |
| 173 | } | 171 | } |
| 174 | 172 | ||
| 175 | 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 1a9e74f35..9abba555b 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -45,7 +45,7 @@ struct Display { | |||
| 45 | std::string name; | 45 | std::string name; |
| 46 | 46 | ||
| 47 | std::vector<Layer> layers; | 47 | std::vector<Layer> layers; |
| 48 | Kernel::SharedPtr<Kernel::WritableEvent> vsync_event; | 48 | Kernel::EventPair vsync_event; |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | class NVFlinger final { | 51 | class NVFlinger final { |