summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp6
-rw-r--r--src/core/hle/kernel/kernel.cpp17
-rw-r--r--src/core/hle/kernel/kernel.h11
-rw-r--r--src/core/hle/kernel/readable_event.cpp24
-rw-r--r--src/core/hle/kernel/readable_event.h17
-rw-r--r--src/core/hle/kernel/svc.cpp4
-rw-r--r--src/core/hle/kernel/writable_event.cpp57
-rw-r--r--src/core/hle/kernel/writable_event.h36
-rw-r--r--src/core/hle/service/am/am.cpp30
-rw-r--r--src/core/hle/service/am/am.h12
-rw-r--r--src/core/hle/service/am/applets/applets.cpp24
-rw-r--r--src/core/hle/service/am/applets/applets.h6
-rw-r--r--src/core/hle/service/aoc/aoc_u.cpp9
-rw-r--r--src/core/hle/service/aoc/aoc_u.h2
-rw-r--r--src/core/hle/service/audio/audout_u.cpp15
-rw-r--r--src/core/hle/service/audio/audren_u.cpp26
-rw-r--r--src/core/hle/service/btdrv/btdrv.cpp10
-rw-r--r--src/core/hle/service/btm/btm.cpp43
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp12
-rw-r--r--src/core/hle/service/hid/controllers/npad.h8
-rw-r--r--src/core/hle/service/nfp/nfp.cpp29
-rw-r--r--src/core/hle/service/nfp/nfp.h8
-rw-r--r--src/core/hle/service/nifm/nifm.cpp16
-rw-r--r--src/core/hle/service/nim/nim.cpp14
-rw-r--r--src/core/hle/service/nvdrv/interface.cpp8
-rw-r--r--src/core/hle/service/nvdrv/interface.h2
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp14
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h8
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp10
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.h2
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
230void KernelCore::AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event) {
231 impl->named_events.emplace(std::move(name), std::move(event));
232}
233
234KernelCore::NamedEventTable::iterator KernelCore::FindNamedEvent(const std::string& name) {
235 return impl->named_events.find(name);
236}
237
238KernelCore::NamedEventTable::const_iterator KernelCore::FindNamedEvent(
239 const std::string& name) const {
240 return impl->named_events.find(name);
241}
242
243void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { 226void 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 {
20class ClientPort; 20class ClientPort;
21class HandleTable; 21class HandleTable;
22class Process; 22class Process;
23class ReadableEvent;
24class ResourceLimit; 23class ResourceLimit;
25class Thread; 24class Thread;
26class Timer; 25class Timer;
@@ -28,7 +27,6 @@ class Timer;
28/// Represents a single instance of the kernel. 27/// Represents a single instance of the kernel.
29class KernelCore { 28class KernelCore {
30private: 29private:
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
34public: 32public:
@@ -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} {}
15ReadableEvent::~ReadableEvent() = default; 15ReadableEvent::~ReadableEvent() = default;
16 16
17bool ReadableEvent::ShouldWait(Thread* thread) const { 17bool ReadableEvent::ShouldWait(Thread* thread) const {
18 return !writable_event->IsSignaled(); 18 return !signaled;
19} 19}
20 20
21void ReadableEvent::Acquire(Thread* thread) { 21void 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
27void ReadableEvent::AddWaitingThread(SharedPtr<Thread> thread) {
28 writable_event->AddWaitingThread(thread);
29}
30
31void ReadableEvent::RemoveWaitingThread(Thread* thread) {
32 writable_event->RemoveWaitingThread(thread);
33} 26}
34 27
35void ReadableEvent::Signal() { 28void ReadableEvent::Signal() {
36 writable_event->Signal(); 29 signaled = true;
30 WakeupAllWaitingThreads();
37} 31}
38 32
39void ReadableEvent::Clear() { 33void ReadableEvent::Clear() {
40 writable_event->Clear(); 34 signaled = false;
41} 35}
42 36
43void ReadableEvent::WakeupAllWaitingThreads() { 37void 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
48private: 44private:
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
13namespace Kernel { 13namespace Kernel {
14 14
15WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {} 15WritableEvent::WritableEvent(KernelCore& kernel) : Object{kernel} {}
16WritableEvent::~WritableEvent() = default; 16WritableEvent::~WritableEvent() = default;
17 17
18std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> WritableEvent::CreateEventPair( 18EventPair 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
32SharedPtr<WritableEvent> WritableEvent::CreateRegisteredEventPair(KernelCore& kernel, 32ResetType 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
40bool WritableEvent::ShouldWait(Thread* thread) const {
41 return !signaled;
42}
43
44void 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
51void WritableEvent::Signal() { 36void WritableEvent::Signal() {
52 signaled = true; 37 readable->Signal();
53 WakeupAllWaitingThreads();
54} 38}
55 39
56void WritableEvent::Clear() { 40void WritableEvent::Clear() {
57 signaled = false; 41 readable->Clear();
58}
59
60void WritableEvent::ResetOnAcquire() {
61 if (reset_type == ResetType::OneShot)
62 Clear();
63}
64
65void WritableEvent::ResetOnWakeup() {
66 if (reset_type == ResetType::Pulse)
67 Clear();
68} 42}
69 43
70bool WritableEvent::IsSignaled() const { 44bool WritableEvent::IsSignaled() const {
71 return signaled; 45 return readable->signaled;
72}
73
74void 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
13class KernelCore; 13class KernelCore;
14class ReadableEvent; 14class ReadableEvent;
15class WritableEvent;
15 16
16class WritableEvent final : public WaitObject { 17struct EventPair {
18 SharedPtr<ReadableEvent> readable;
19 SharedPtr<WritableEvent> writable;
20};
21
22class WritableEvent final : public Object {
17public: 23public:
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
66private: 53private:
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
217ISelfController::~ISelfController() = default; 217ISelfController::~ISelfController() = default;
@@ -297,11 +297,11 @@ void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) {
297void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { 297void 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
306void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) { 306void 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
350AppletMessageQueue::AppletMessageQueue() { 350AppletMessageQueue::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
360const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetMesssageRecieveEvent() 360const 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
367const Kernel::SharedPtr<Kernel::ReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() 365const 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
374void AppletMessageQueue::PushMessage(AppletMessage msg) { 370void 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
379AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { 375AppletMessageQueue::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 {
396void AppletMessageQueue::OperationModeChanged() { 392void 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
402ICommonStateGetter::ICommonStateGetter(std::shared_ptr<AppletMessageQueue> msg_queue) 398ICommonStateGetter::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
11namespace Kernel {
12class ReadableEvent;
13class WritableEvent;
14} // namespace Kernel
15
16namespace Service { 12namespace Service {
17namespace NVFlinger { 13namespace NVFlinger {
18class NVFlinger; 14class NVFlinger;
@@ -62,8 +58,8 @@ public:
62 58
63private: 59private:
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
69class IWindowController final : public ServiceFramework<IWindowController> { 65class 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
16AppletDataBroker::AppletDataBroker() { 16AppletDataBroker::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
68void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { 68void 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
73void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { 73void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) {
@@ -76,29 +76,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) {
76 76
77void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { 77void 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
82void AppletDataBroker::SignalStateChanged() const { 82void AppletDataBroker::SignalStateChanged() const {
83 state_changed_event->Signal(); 83 state_changed_event.writable->Signal();
84} 84}
85 85
86Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetNormalDataEvent() const { 86Kernel::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
92Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { 90Kernel::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
98Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent() const { 94Kernel::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
104Applet::Applet() = default; 98Applet::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
72class Applet { 72class 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
70AOC_U::~AOC_U() = default; 70AOC_U::~AOC_U() = default;
@@ -144,12 +144,9 @@ void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) {
144void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { 144void 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
155void InstallInterfaces(SM::ServiceManager& service_manager) { 152void 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
79private: 80private:
@@ -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
198void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) { 197void 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
51private: 51private:
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
173private: 171private:
@@ -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
41private: 41private:
@@ -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
53class BtDrv final : public ServiceFramework<BtDrv> { 53class 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
70private: 70private:
@@ -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
118class BTM_USR final : public ServiceFramework<BTM_USR> { 109class 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
170void Controller_NPad::OnInit() { 170void 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
513void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { 513void 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,
543Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { 543Kernel::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
552Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { 550Controller_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
15namespace Kernel {
16class ReadableEvent;
17class WritableEvent;
18} // namespace Kernel
19
20namespace Service::HID { 16namespace Service::HID {
21 17
22constexpr u32 NPAD_HANDHELD = 32; 18constexpr 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,
25Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) 25Module::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
32Module::Interface::~Interface() = default; 32Module::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
353const Kernel::SharedPtr<Kernel::ReadableEvent>& Module::Interface::GetNFCEvent() const { 348const 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
357const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { 352const 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
11namespace Kernel {
12class ReadableEvent;
13class WritableEvent;
14} // namespace Kernel
15
16namespace Service::NFP { 12namespace Service::NFP {
17 13
18class Module final { 14class 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
67private: 67private:
@@ -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
119class INetworkProfile final : public ServiceFramework<INetworkProfile> { 115class 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
148private: 148private:
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
138NVDRV::~NVDRV() = default; 136NVDRV::~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
17BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) { 17BufferQueue::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
23BufferQueue::~BufferQueue() = default; 23BufferQueue::~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
37std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) { 37std::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
96u32 BufferQueue::Query(QueryType type) { 96u32 BufferQueue::Query(QueryType type) {
@@ -108,13 +108,11 @@ u32 BufferQueue::Query(QueryType type) {
108} 108}
109 109
110Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { 110Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const {
111 return buffer_wait_event; 111 return buffer_wait_event.writable;
112} 112}
113 113
114Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const { 114Kernel::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
15namespace CoreTiming { 16namespace CoreTiming {
16struct EventType; 17struct EventType;
17} 18}
18 19
19namespace Kernel {
20class ReadableEvent;
21class WritableEvent;
22} // namespace Kernel
23
24namespace Service::NVFlinger { 20namespace Service::NVFlinger {
25 21
26struct IGBPBuffer { 22struct 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
89Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) { 89Kernel::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
95std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const { 93std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const {
@@ -121,7 +119,7 @@ Layer& NVFlinger::GetLayer(u64 display_id, u64 layer_id) {
121void NVFlinger::Compose() { 119void 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
169Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) { 167Display::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
175Display::~Display() = default; 173Display::~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
51class NVFlinger final { 51class NVFlinger final {