summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2021-04-10 02:34:26 -0700
committerGravatar bunnei2021-05-05 16:40:51 -0700
commit2e8d6fe9a0c07538397682e1cb25992bfd15676d (patch)
tree444ee462a197818e0114150a03c0a5898cadaa19 /src
parenthle: ipc_helpers: Add methods for copy/move references. (diff)
downloadyuzu-2e8d6fe9a0c07538397682e1cb25992bfd15676d.tar.gz
yuzu-2e8d6fe9a0c07538397682e1cb25992bfd15676d.tar.xz
yuzu-2e8d6fe9a0c07538397682e1cb25992bfd15676d.zip
hle: kernel: Migrate KReadableEvent and KWritableEvent to KAutoObject.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/handle_table.cpp4
-rw-r--r--src/core/hle/kernel/k_event.cpp17
-rw-r--r--src/core/hle/kernel/k_event.h33
-rw-r--r--src/core/hle/kernel/k_readable_event.cpp15
-rw-r--r--src/core/hle/kernel/k_readable_event.h41
-rw-r--r--src/core/hle/kernel/k_writable_event.cpp18
-rw-r--r--src/core/hle/kernel/k_writable_event.h34
-rw-r--r--src/core/hle/kernel/kernel.h4
-rw-r--r--src/core/hle/kernel/svc.cpp70
-rw-r--r--src/core/hle/service/am/am.cpp24
-rw-r--r--src/core/hle/service/am/am.h4
-rw-r--r--src/core/hle/service/am/applets/applets.cpp22
-rw-r--r--src/core/hle/service/am/applets/applets.h8
-rw-r--r--src/core/hle/service/audio/audout_u.cpp2
-rw-r--r--src/core/hle/service/audio/audren_u.cpp4
-rw-r--r--src/core/hle/service/bcat/backend/backend.cpp8
-rw-r--r--src/core/hle/service/bcat/backend/backend.h4
-rw-r--r--src/core/hle/service/bcat/module.cpp10
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp9
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/nfp/nfp.cpp10
-rw-r--r--src/core/hle/service/nfp/nfp.h2
-rw-r--r--src/core/hle/service/nim/nim.cpp4
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp6
-rw-r--r--src/core/hle/service/nvdrv/interface.cpp6
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp8
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.h4
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp12
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h4
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp6
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.h2
-rw-r--r--src/core/hle/service/ptm/psm.cpp6
-rw-r--r--src/core/hle/service/vi/display/vi_display.cpp4
-rw-r--r--src/core/hle/service/vi/display/vi_display.h2
-rw-r--r--src/core/hle/service/vi/vi.cpp6
35 files changed, 215 insertions, 200 deletions
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp
index 58c49460f..cc3210ef2 100644
--- a/src/core/hle/kernel/handle_table.cpp
+++ b/src/core/hle/kernel/handle_table.cpp
@@ -54,7 +54,9 @@ ResultVal<Handle> HandleTable::Create(Object* obj) {
54 case HandleType::SharedMemory: 54 case HandleType::SharedMemory:
55 case HandleType::Thread: 55 case HandleType::Thread:
56 case HandleType::Event: 56 case HandleType::Event:
57 case HandleType::Process: { 57 case HandleType::Process:
58 case HandleType::ReadableEvent:
59 case HandleType::WritableEvent: {
58 Handle handle{}; 60 Handle handle{};
59 Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); 61 Add(&handle, reinterpret_cast<KAutoObject*>(obj), {});
60 return MakeResult<Handle>(handle); 62 return MakeResult<Handle>(handle);
diff --git a/src/core/hle/kernel/k_event.cpp b/src/core/hle/kernel/k_event.cpp
index 4020e5325..fdec0c36f 100644
--- a/src/core/hle/kernel/k_event.cpp
+++ b/src/core/hle/kernel/k_event.cpp
@@ -3,14 +3,13 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/hle/kernel/k_event.h" 5#include "core/hle/kernel/k_event.h"
6#include "core/hle/kernel/k_readable_event.h"
7#include "core/hle/kernel/k_resource_limit.h" 6#include "core/hle/kernel/k_resource_limit.h"
8#include "core/hle/kernel/k_writable_event.h"
9#include "core/hle/kernel/process.h" 7#include "core/hle/kernel/process.h"
10 8
11namespace Kernel { 9namespace Kernel {
12 10
13KEvent::KEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {} 11KEvent::KEvent(KernelCore& kernel)
12 : KAutoObjectWithSlabHeapAndContainer{kernel}, readable_event{kernel}, writable_event{kernel} {}
14 13
15KEvent::~KEvent() = default; 14KEvent::~KEvent() = default;
16 15
@@ -21,17 +20,13 @@ void KEvent::Initialize(std::string&& name_) {
21 // writable events are closed this object will be destroyed. 20 // writable events are closed this object will be destroyed.
22 Open(); 21 Open();
23 22
24 //// Create our sub events.
25 //KAutoObject::Create(readable_event.get());
26 //KAutoObject::Create(writable_event.get());
27
28 // Create our sub events. 23 // Create our sub events.
29 readable_event = std::make_shared<KReadableEvent>(kernel, name_ + ":Readable"); 24 KAutoObject::Create(std::addressof(readable_event));
30 writable_event = std::make_shared<KWritableEvent>(kernel, name_ + ":Writable"); 25 KAutoObject::Create(std::addressof(writable_event));
31 26
32 // Initialize our sub sessions. 27 // Initialize our sub sessions.
33 readable_event->Initialize(this); 28 readable_event.Initialize(this, name_ + ":Readable");
34 writable_event->Initialize(this); 29 writable_event.Initialize(this, name_ + ":Writable");
35 30
36 // Set our owner process. 31 // Set our owner process.
37 owner = kernel.CurrentProcess(); 32 owner = kernel.CurrentProcess();
diff --git a/src/core/hle/kernel/k_event.h b/src/core/hle/kernel/k_event.h
index 97ec0ea9c..2c48a0499 100644
--- a/src/core/hle/kernel/k_event.h
+++ b/src/core/hle/kernel/k_event.h
@@ -4,6 +4,8 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/k_readable_event.h"
8#include "core/hle/kernel/k_writable_event.h"
7#include "core/hle/kernel/slab_helpers.h" 9#include "core/hle/kernel/slab_helpers.h"
8 10
9namespace Kernel { 11namespace Kernel {
@@ -27,40 +29,39 @@ public:
27 virtual bool IsInitialized() const override { 29 virtual bool IsInitialized() const override {
28 return initialized; 30 return initialized;
29 } 31 }
32
30 virtual uintptr_t GetPostDestroyArgument() const override { 33 virtual uintptr_t GetPostDestroyArgument() const override {
31 return reinterpret_cast<uintptr_t>(owner); 34 return reinterpret_cast<uintptr_t>(owner);
32 } 35 }
33 36
34 static void PostDestroy(uintptr_t arg); 37 static void PostDestroy(uintptr_t arg);
35 38
36 std::string GetTypeName() const override { 39 virtual Process* GetOwner() const override {
37 return "KEvent"; 40 return owner;
38 } 41 }
39 42
40 static constexpr HandleType HANDLE_TYPE = HandleType::Event; 43 KReadableEvent& GetReadableEvent() {
41 HandleType GetHandleType() const override { 44 return readable_event;
42 return HANDLE_TYPE;
43 }
44
45 KReadableEvent* GetReadableEvent() {
46 return readable_event.get();
47 } 45 }
48 46
49 std::shared_ptr<KWritableEvent>& GetWritableEvent() { 47 KWritableEvent& GetWritableEvent() {
50 return writable_event; 48 return writable_event;
51 } 49 }
52 50
53 const std::shared_ptr<KReadableEvent>& GetReadableEvent() const { 51 // DEPRECATED
54 return readable_event; 52
53 std::string GetTypeName() const override {
54 return "KEvent";
55 } 55 }
56 56
57 const std::shared_ptr<KWritableEvent>& GetWritableEvent() const { 57 static constexpr HandleType HANDLE_TYPE = HandleType::Event;
58 return writable_event; 58 HandleType GetHandleType() const override {
59 return HANDLE_TYPE;
59 } 60 }
60 61
61private: 62private:
62 std::shared_ptr<KReadableEvent> readable_event; 63 KReadableEvent readable_event;
63 std::shared_ptr<KWritableEvent> writable_event; 64 KWritableEvent writable_event;
64 Process* owner{}; 65 Process* owner{};
65 bool initialized{}; 66 bool initialized{};
66}; 67};
diff --git a/src/core/hle/kernel/k_readable_event.cpp b/src/core/hle/kernel/k_readable_event.cpp
index 4b4d34857..8fef4bb00 100644
--- a/src/core/hle/kernel/k_readable_event.cpp
+++ b/src/core/hle/kernel/k_readable_event.cpp
@@ -2,21 +2,18 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm>
6#include "common/assert.h" 5#include "common/assert.h"
7#include "common/common_funcs.h" 6#include "core/hle/kernel/k_event.h"
8#include "common/logging/log.h"
9#include "core/hle/kernel/k_readable_event.h" 7#include "core/hle/kernel/k_readable_event.h"
10#include "core/hle/kernel/k_scheduler.h" 8#include "core/hle/kernel/k_scheduler.h"
11#include "core/hle/kernel/k_thread.h" 9#include "core/hle/kernel/k_thread.h"
12#include "core/hle/kernel/kernel.h" 10#include "core/hle/kernel/kernel.h"
13#include "core/hle/kernel/object.h"
14#include "core/hle/kernel/svc_results.h" 11#include "core/hle/kernel/svc_results.h"
15 12
16namespace Kernel { 13namespace Kernel {
17 14
18KReadableEvent::KReadableEvent(KernelCore& kernel, std::string&& name) 15KReadableEvent::KReadableEvent(KernelCore& kernel) : KSynchronizationObject{kernel} {}
19 : KSynchronizationObject{kernel, std::move(name)} {} 16
20KReadableEvent::~KReadableEvent() = default; 17KReadableEvent::~KReadableEvent() = default;
21 18
22bool KReadableEvent::IsSignaled() const { 19bool KReadableEvent::IsSignaled() const {
@@ -25,6 +22,12 @@ bool KReadableEvent::IsSignaled() const {
25 return is_signaled; 22 return is_signaled;
26} 23}
27 24
25void KReadableEvent::Destroy() {
26 if (parent) {
27 parent->Close();
28 }
29}
30
28ResultCode KReadableEvent::Signal() { 31ResultCode KReadableEvent::Signal() {
29 KScopedSchedulerLock lk{kernel}; 32 KScopedSchedulerLock lk{kernel};
30 33
diff --git a/src/core/hle/kernel/k_readable_event.h b/src/core/hle/kernel/k_readable_event.h
index e6f0fd900..4c22f0584 100644
--- a/src/core/hle/kernel/k_readable_event.h
+++ b/src/core/hle/kernel/k_readable_event.h
@@ -4,8 +4,10 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/k_auto_object.h"
7#include "core/hle/kernel/k_synchronization_object.h" 8#include "core/hle/kernel/k_synchronization_object.h"
8#include "core/hle/kernel/object.h" 9#include "core/hle/kernel/object.h"
10#include "core/hle/kernel/slab_helpers.h"
9#include "core/hle/result.h" 11#include "core/hle/result.h"
10 12
11namespace Kernel { 13namespace Kernel {
@@ -13,36 +15,41 @@ namespace Kernel {
13class KernelCore; 15class KernelCore;
14class KEvent; 16class KEvent;
15 17
16class KReadableEvent final : public KSynchronizationObject { 18class KReadableEvent : public KSynchronizationObject {
19 KERNEL_AUTOOBJECT_TRAITS(KReadableEvent, KSynchronizationObject);
20
17public: 21public:
18 explicit KReadableEvent(KernelCore& kernel, std::string&& name); 22 explicit KReadableEvent(KernelCore& kernel);
19 ~KReadableEvent() override; 23 ~KReadableEvent() override;
20 24
21 std::string GetTypeName() const override { 25 void Initialize(KEvent* parent_, std::string&& name_) {
22 return "KReadableEvent"; 26 is_signaled = false;
23 } 27 parent = parent_;
24 28 name = std::move(name_);
25 static constexpr HandleType HANDLE_TYPE = HandleType::ReadableEvent;
26 HandleType GetHandleType() const override {
27 return HANDLE_TYPE;
28 } 29 }
29 30
30 KEvent* GetParent() const { 31 constexpr KEvent* GetParent() const {
31 return parent; 32 return parent;
32 } 33 }
33 34
34 void Initialize(KEvent* parent_) { 35 virtual bool IsSignaled() const override;
35 is_signaled = false; 36 virtual void Destroy() override;
36 parent = parent_;
37 }
38
39 bool IsSignaled() const override;
40 void Finalize() override {}
41 37
42 ResultCode Signal(); 38 ResultCode Signal();
43 ResultCode Clear(); 39 ResultCode Clear();
44 ResultCode Reset(); 40 ResultCode Reset();
45 41
42 // DEPRECATED
43
44 std::string GetTypeName() const override {
45 return "KReadableEvent";
46 }
47
48 static constexpr HandleType HANDLE_TYPE = HandleType::ReadableEvent;
49 HandleType GetHandleType() const override {
50 return HANDLE_TYPE;
51 }
52
46private: 53private:
47 bool is_signaled{}; 54 bool is_signaled{};
48 KEvent* parent{}; 55 KEvent* parent{};
diff --git a/src/core/hle/kernel/k_writable_event.cpp b/src/core/hle/kernel/k_writable_event.cpp
index 25c52edb2..a430e0661 100644
--- a/src/core/hle/kernel/k_writable_event.cpp
+++ b/src/core/hle/kernel/k_writable_event.cpp
@@ -8,20 +8,28 @@
8 8
9namespace Kernel { 9namespace Kernel {
10 10
11KWritableEvent::KWritableEvent(KernelCore& kernel, std::string&& name) 11KWritableEvent::KWritableEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {}
12 : Object{kernel, std::move(name)} {} 12
13KWritableEvent::~KWritableEvent() = default; 13KWritableEvent::~KWritableEvent() = default;
14 14
15void KWritableEvent::Initialize(KEvent* parent_) { 15void KWritableEvent::Initialize(KEvent* parent_, std::string&& name_) {
16 parent = parent_; 16 parent = parent_;
17 name = std::move(name_);
18 parent->GetReadableEvent().Open();
17} 19}
18 20
19ResultCode KWritableEvent::Signal() { 21ResultCode KWritableEvent::Signal() {
20 return parent->GetReadableEvent()->Signal(); 22 return parent->GetReadableEvent().Signal();
21} 23}
22 24
23ResultCode KWritableEvent::Clear() { 25ResultCode KWritableEvent::Clear() {
24 return parent->GetReadableEvent()->Clear(); 26 return parent->GetReadableEvent().Clear();
27}
28
29void KWritableEvent::Destroy() {
30 // Close our references.
31 parent->GetReadableEvent().Close();
32 parent->Close();
25} 33}
26 34
27} // namespace Kernel 35} // namespace Kernel
diff --git a/src/core/hle/kernel/k_writable_event.h b/src/core/hle/kernel/k_writable_event.h
index 518f5448d..7cf43f77e 100644
--- a/src/core/hle/kernel/k_writable_event.h
+++ b/src/core/hle/kernel/k_writable_event.h
@@ -4,7 +4,9 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/k_auto_object.h"
7#include "core/hle/kernel/object.h" 8#include "core/hle/kernel/object.h"
9#include "core/hle/kernel/slab_helpers.h"
8#include "core/hle/result.h" 10#include "core/hle/result.h"
9 11
10namespace Kernel { 12namespace Kernel {
@@ -12,11 +14,28 @@ namespace Kernel {
12class KernelCore; 14class KernelCore;
13class KEvent; 15class KEvent;
14 16
15class KWritableEvent final : public Object { 17class KWritableEvent final
18 : public KAutoObjectWithSlabHeapAndContainer<KWritableEvent, KAutoObjectWithList> {
19 KERNEL_AUTOOBJECT_TRAITS(KWritableEvent, KAutoObject);
20
16public: 21public:
17 explicit KWritableEvent(KernelCore& kernel, std::string&& name); 22 explicit KWritableEvent(KernelCore& kernel);
18 ~KWritableEvent() override; 23 ~KWritableEvent() override;
19 24
25 virtual void Destroy() override;
26
27 static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
28
29 void Initialize(KEvent* parent_, std::string&& name_);
30 ResultCode Signal();
31 ResultCode Clear();
32
33 constexpr KEvent* GetParent() const {
34 return parent;
35 }
36
37 // DEPRECATED
38
20 std::string GetTypeName() const override { 39 std::string GetTypeName() const override {
21 return "KWritableEvent"; 40 return "KWritableEvent";
22 } 41 }
@@ -26,17 +45,6 @@ public:
26 return HANDLE_TYPE; 45 return HANDLE_TYPE;
27 } 46 }
28 47
29 void Initialize(KEvent* parent_);
30
31 void Finalize() override {}
32
33 ResultCode Signal();
34 ResultCode Clear();
35
36 KEvent* GetParent() const {
37 return parent;
38 }
39
40private: 48private:
41 KEvent* parent{}; 49 KEvent* parent{};
42}; 50};
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index e494fe9f3..850436eb3 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -40,6 +40,7 @@ class KResourceLimit;
40class KScheduler; 40class KScheduler;
41class KSharedMemory; 41class KSharedMemory;
42class KThread; 42class KThread;
43class KWritableEvent;
43class PhysicalCore; 44class PhysicalCore;
44class Process; 45class Process;
45class ServiceThread; 46class ServiceThread;
@@ -269,6 +270,8 @@ public:
269 return slab_heap_container->shared_memory; 270 return slab_heap_container->shared_memory;
270 } else if constexpr (std::is_same_v<T, KLinkedListNode>) { 271 } else if constexpr (std::is_same_v<T, KLinkedListNode>) {
271 return slab_heap_container->linked_list_node; 272 return slab_heap_container->linked_list_node;
273 } else if constexpr (std::is_same_v<T, KWritableEvent>) {
274 return slab_heap_container->writeable_event;
272 } 275 }
273 } 276 }
274 277
@@ -308,6 +311,7 @@ private:
308 KSlabHeap<KEvent> event; 311 KSlabHeap<KEvent> event;
309 KSlabHeap<KSharedMemory> shared_memory; 312 KSlabHeap<KSharedMemory> shared_memory;
310 KSlabHeap<KLinkedListNode> linked_list_node; 313 KSlabHeap<KLinkedListNode> linked_list_node;
314 KSlabHeap<KWritableEvent> writeable_event;
311 }; 315 };
312 316
313 std::unique_ptr<SlabHeapContainer> slab_heap_container; 317 std::unique_ptr<SlabHeapContainer> slab_heap_container;
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 8050359be..c6334f91c 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1745,16 +1745,16 @@ static ResultCode ResetSignal(Core::System& system, Handle handle) {
1745 1745
1746 // Try to reset as readable event. 1746 // Try to reset as readable event.
1747 { 1747 {
1748 auto readable_event = handle_table.Get<KReadableEvent>(handle); 1748 KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(handle);
1749 if (readable_event) { 1749 if (readable_event.IsNotNull()) {
1750 return readable_event->Reset(); 1750 return readable_event->Reset();
1751 } 1751 }
1752 } 1752 }
1753 1753
1754 // Try to reset as process. 1754 // Try to reset as process.
1755 { 1755 {
1756 auto process = handle_table.Get<Process>(handle); 1756 KScopedAutoObject process = handle_table.GetObject<Process>(handle);
1757 if (process) { 1757 if (process.IsNotNull()) {
1758 return process->Reset(); 1758 return process->Reset();
1759 } 1759 }
1760 } 1760 }
@@ -1885,27 +1885,12 @@ static ResultCode SetThreadCoreMask32(Core::System& system, Handle thread_handle
1885static ResultCode SignalEvent(Core::System& system, Handle event_handle) { 1885static ResultCode SignalEvent(Core::System& system, Handle event_handle) {
1886 LOG_DEBUG(Kernel_SVC, "called, event_handle=0x{:08X}", event_handle); 1886 LOG_DEBUG(Kernel_SVC, "called, event_handle=0x{:08X}", event_handle);
1887 1887
1888 auto& kernel = system.Kernel();
1889 // Get the current handle table. 1888 // Get the current handle table.
1890 const HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); 1889 const HandleTable& handle_table = system.Kernel().CurrentProcess()->GetHandleTable();
1891
1892 // Reserve a new event from the process resource limit.
1893 KScopedResourceReservation event_reservation(kernel.CurrentProcess(),
1894 LimitableResource::Events);
1895 if (!event_reservation.Succeeded()) {
1896 LOG_ERROR(Kernel, "Could not reserve a new event");
1897 return ResultResourceLimitedExceeded;
1898 }
1899 1890
1900 // Get the writable event. 1891 // Get the writable event.
1901 auto writable_event = handle_table.Get<KWritableEvent>(event_handle); 1892 KScopedAutoObject writable_event = handle_table.GetObject<KWritableEvent>(event_handle);
1902 if (!writable_event) { 1893 R_UNLESS(writable_event.IsNotNull(), ResultInvalidHandle);
1903 LOG_ERROR(Kernel_SVC, "Invalid event handle provided (handle={:08X})", event_handle);
1904 return ResultInvalidHandle;
1905 }
1906
1907 // Commit the successfuly reservation.
1908 event_reservation.Commit();
1909 1894
1910 return writable_event->Signal(); 1895 return writable_event->Signal();
1911} 1896}
@@ -1922,16 +1907,16 @@ static ResultCode ClearEvent(Core::System& system, Handle event_handle) {
1922 1907
1923 // Try to clear the writable event. 1908 // Try to clear the writable event.
1924 { 1909 {
1925 auto writable_event = handle_table.Get<KWritableEvent>(event_handle); 1910 KScopedAutoObject writable_event = handle_table.GetObject<KWritableEvent>(event_handle);
1926 if (writable_event) { 1911 if (writable_event.IsNotNull()) {
1927 return writable_event->Clear(); 1912 return writable_event->Clear();
1928 } 1913 }
1929 } 1914 }
1930 1915
1931 // Try to clear the readable event. 1916 // Try to clear the readable event.
1932 { 1917 {
1933 auto readable_event = handle_table.Get<KReadableEvent>(event_handle); 1918 KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(event_handle);
1934 if (readable_event) { 1919 if (readable_event.IsNotNull()) {
1935 return readable_event->Clear(); 1920 return readable_event->Clear();
1936 } 1921 }
1937 } 1922 }
@@ -1950,7 +1935,12 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1950 1935
1951 // Get the kernel reference and handle table. 1936 // Get the kernel reference and handle table.
1952 auto& kernel = system.Kernel(); 1937 auto& kernel = system.Kernel();
1953 HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); 1938 auto& handle_table = kernel.CurrentProcess()->GetHandleTable();
1939
1940 // Reserve a new event from the process resource limit
1941 KScopedResourceReservation event_reservation(kernel.CurrentProcess(),
1942 LimitableResource::Events);
1943 R_UNLESS(event_reservation.Succeeded(), ResultResourceLimitedExceeded);
1954 1944
1955 // Create a new event. 1945 // Create a new event.
1956 KEvent* event = KEvent::Create(kernel); 1946 KEvent* event = KEvent::Create(kernel);
@@ -1959,22 +1949,26 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1959 // Initialize the event. 1949 // Initialize the event.
1960 event->Initialize("CreateEvent"); 1950 event->Initialize("CreateEvent");
1961 1951
1952 // Commit the thread reservation.
1953 event_reservation.Commit();
1954
1955 // Ensure that we clean up the event (and its only references are handle table) on function end.
1956 SCOPE_EXIT({
1957 event->GetWritableEvent().Close();
1958 event->GetReadableEvent().Close();
1959 });
1960
1961 // Register the event.
1962 KEvent::Register(kernel, event);
1963
1962 // Add the writable event to the handle table. 1964 // Add the writable event to the handle table.
1963 const auto write_create_result = handle_table.Create(event->GetWritableEvent().get()); 1965 R_TRY(handle_table.Add(out_write, std::addressof(event->GetWritableEvent())));
1964 if (write_create_result.Failed()) {
1965 return write_create_result.Code();
1966 }
1967 *out_write = *write_create_result;
1968 1966
1969 // Add the writable event to the handle table. 1967 // Add the writable event to the handle table.
1970 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); }); 1968 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*out_write); });
1971 1969
1972 // Add the readable event to the handle table. 1970 // Add the readable event to the handle table.
1973 const auto read_create_result = handle_table.Create(event->GetReadableEvent()); 1971 R_TRY(handle_table.Add(out_read, std::addressof(event->GetReadableEvent())));
1974 if (read_create_result.Failed()) {
1975 return read_create_result.Code();
1976 }
1977 *out_read = *read_create_result;
1978 1972
1979 // We succeeded. 1973 // We succeeded.
1980 handle_guard.Cancel(); 1974 handle_guard.Cancel();
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index c1982e996..937020a6e 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -320,7 +320,7 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv
320 Kernel::KAutoObject::Create(std::addressof(accumulated_suspended_tick_changed_event)); 320 Kernel::KAutoObject::Create(std::addressof(accumulated_suspended_tick_changed_event));
321 accumulated_suspended_tick_changed_event.Initialize( 321 accumulated_suspended_tick_changed_event.Initialize(
322 "ISelfController:AccumulatedSuspendedTickChangedEvent"); 322 "ISelfController:AccumulatedSuspendedTickChangedEvent");
323 accumulated_suspended_tick_changed_event.GetWritableEvent()->Signal(); 323 accumulated_suspended_tick_changed_event.GetWritableEvent().Signal();
324} 324}
325 325
326ISelfController::~ISelfController() = default; 326ISelfController::~ISelfController() = default;
@@ -379,7 +379,7 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) {
379void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { 379void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) {
380 LOG_WARNING(Service_AM, "(STUBBED) called"); 380 LOG_WARNING(Service_AM, "(STUBBED) called");
381 381
382 launchable_event.GetWritableEvent()->Signal(); 382 launchable_event.GetWritableEvent().Signal();
383 383
384 IPC::ResponseBuilder rb{ctx, 2, 1}; 384 IPC::ResponseBuilder rb{ctx, 2, 1};
385 rb.Push(RESULT_SUCCESS); 385 rb.Push(RESULT_SUCCESS);
@@ -592,28 +592,28 @@ AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel)
592 592
593AppletMessageQueue::~AppletMessageQueue() = default; 593AppletMessageQueue::~AppletMessageQueue() = default;
594 594
595Kernel::KReadableEvent* AppletMessageQueue::GetMessageReceiveEvent() const { 595Kernel::KReadableEvent& AppletMessageQueue::GetMessageReceiveEvent() {
596 return on_new_message.GetReadableEvent().get(); 596 return on_new_message.GetReadableEvent();
597} 597}
598 598
599Kernel::KReadableEvent* AppletMessageQueue::GetOperationModeChangedEvent() const { 599Kernel::KReadableEvent& AppletMessageQueue::GetOperationModeChangedEvent() {
600 return on_operation_mode_changed.GetReadableEvent().get(); 600 return on_operation_mode_changed.GetReadableEvent();
601} 601}
602 602
603void AppletMessageQueue::PushMessage(AppletMessage msg) { 603void AppletMessageQueue::PushMessage(AppletMessage msg) {
604 messages.push(msg); 604 messages.push(msg);
605 on_new_message.GetWritableEvent()->Signal(); 605 on_new_message.GetWritableEvent().Signal();
606} 606}
607 607
608AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { 608AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() {
609 if (messages.empty()) { 609 if (messages.empty()) {
610 on_new_message.GetWritableEvent()->Clear(); 610 on_new_message.GetWritableEvent().Clear();
611 return AppletMessage::NoMessage; 611 return AppletMessage::NoMessage;
612 } 612 }
613 auto msg = messages.front(); 613 auto msg = messages.front();
614 messages.pop(); 614 messages.pop();
615 if (messages.empty()) { 615 if (messages.empty()) {
616 on_new_message.GetWritableEvent()->Clear(); 616 on_new_message.GetWritableEvent().Clear();
617 } 617 }
618 return msg; 618 return msg;
619} 619}
@@ -633,7 +633,7 @@ void AppletMessageQueue::FocusStateChanged() {
633void AppletMessageQueue::OperationModeChanged() { 633void AppletMessageQueue::OperationModeChanged() {
634 PushMessage(AppletMessage::OperationModeChanged); 634 PushMessage(AppletMessage::OperationModeChanged);
635 PushMessage(AppletMessage::PerformanceModeChanged); 635 PushMessage(AppletMessage::PerformanceModeChanged);
636 on_operation_mode_changed.GetWritableEvent()->Signal(); 636 on_operation_mode_changed.GetWritableEvent().Signal();
637} 637}
638 638
639ICommonStateGetter::ICommonStateGetter(Core::System& system_, 639ICommonStateGetter::ICommonStateGetter(Core::System& system_,
@@ -930,11 +930,9 @@ private:
930 void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { 930 void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) {
931 LOG_DEBUG(Service_AM, "called"); 931 LOG_DEBUG(Service_AM, "called");
932 932
933 const auto event = applet->GetBroker().GetStateChangedEvent();
934
935 IPC::ResponseBuilder rb{ctx, 2, 1}; 933 IPC::ResponseBuilder rb{ctx, 2, 1};
936 rb.Push(RESULT_SUCCESS); 934 rb.Push(RESULT_SUCCESS);
937 rb.PushCopyObjects(event); 935 rb.PushCopyObjects(applet->GetBroker().GetStateChangedEvent());
938 } 936 }
939 937
940 void IsCompleted(Kernel::HLERequestContext& ctx) { 938 void IsCompleted(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h
index 8f6017c4e..fbac7b2cf 100644
--- a/src/core/hle/service/am/am.h
+++ b/src/core/hle/service/am/am.h
@@ -56,8 +56,8 @@ public:
56 explicit AppletMessageQueue(Kernel::KernelCore& kernel); 56 explicit AppletMessageQueue(Kernel::KernelCore& kernel);
57 ~AppletMessageQueue(); 57 ~AppletMessageQueue();
58 58
59 Kernel::KReadableEvent* GetMessageReceiveEvent() const; 59 Kernel::KReadableEvent& GetMessageReceiveEvent();
60 Kernel::KReadableEvent* GetOperationModeChangedEvent() const; 60 Kernel::KReadableEvent& GetOperationModeChangedEvent();
61 void PushMessage(AppletMessage msg); 61 void PushMessage(AppletMessage msg);
62 AppletMessage PopMessage(); 62 AppletMessage PopMessage();
63 std::size_t GetMessageCount() const; 63 std::size_t GetMessageCount() const;
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index 6cceff064..cf8ad7598 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -66,7 +66,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() {
66 66
67 auto out = std::move(out_channel.front()); 67 auto out = std::move(out_channel.front());
68 out_channel.pop_front(); 68 out_channel.pop_front();
69 pop_out_data_event.GetWritableEvent()->Clear(); 69 pop_out_data_event.GetWritableEvent().Clear();
70 return out; 70 return out;
71} 71}
72 72
@@ -85,7 +85,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() {
85 85
86 auto out = std::move(out_interactive_channel.front()); 86 auto out = std::move(out_interactive_channel.front());
87 out_interactive_channel.pop_front(); 87 out_interactive_channel.pop_front();
88 pop_interactive_out_data_event.GetWritableEvent()->Clear(); 88 pop_interactive_out_data_event.GetWritableEvent().Clear();
89 return out; 89 return out;
90} 90}
91 91
@@ -104,7 +104,7 @@ void AppletDataBroker::PushNormalDataFromGame(std::shared_ptr<IStorage>&& storag
104 104
105void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { 105void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) {
106 out_channel.emplace_back(std::move(storage)); 106 out_channel.emplace_back(std::move(storage));
107 pop_out_data_event.GetWritableEvent()->Signal(); 107 pop_out_data_event.GetWritableEvent().Signal();
108} 108}
109 109
110void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { 110void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) {
@@ -113,11 +113,11 @@ void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& s
113 113
114void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { 114void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) {
115 out_interactive_channel.emplace_back(std::move(storage)); 115 out_interactive_channel.emplace_back(std::move(storage));
116 pop_interactive_out_data_event.GetWritableEvent()->Signal(); 116 pop_interactive_out_data_event.GetWritableEvent().Signal();
117} 117}
118 118
119void AppletDataBroker::SignalStateChanged() { 119void AppletDataBroker::SignalStateChanged() {
120 state_changed_event.GetWritableEvent()->Signal(); 120 state_changed_event.GetWritableEvent().Signal();
121 121
122 switch (applet_mode) { 122 switch (applet_mode) {
123 case LibraryAppletMode::AllForeground: 123 case LibraryAppletMode::AllForeground:
@@ -141,16 +141,16 @@ void AppletDataBroker::SignalStateChanged() {
141 } 141 }
142} 142}
143 143
144Kernel::KReadableEvent* AppletDataBroker::GetNormalDataEvent() const { 144Kernel::KReadableEvent& AppletDataBroker::GetNormalDataEvent() {
145 return pop_out_data_event.GetReadableEvent().get(); 145 return pop_out_data_event.GetReadableEvent();
146} 146}
147 147
148Kernel::KReadableEvent* AppletDataBroker::GetInteractiveDataEvent() const { 148Kernel::KReadableEvent& AppletDataBroker::GetInteractiveDataEvent() {
149 return pop_interactive_out_data_event.GetReadableEvent().get(); 149 return pop_interactive_out_data_event.GetReadableEvent();
150} 150}
151 151
152Kernel::KReadableEvent* AppletDataBroker::GetStateChangedEvent() const { 152Kernel::KReadableEvent& AppletDataBroker::GetStateChangedEvent() {
153 return state_changed_event.GetReadableEvent().get(); 153 return state_changed_event.GetReadableEvent();
154} 154}
155 155
156Applet::Applet(Core::System& system_, LibraryAppletMode applet_mode_) 156Applet::Applet(Core::System& system_, LibraryAppletMode applet_mode_)
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h
index 327843a98..229dc7a1e 100644
--- a/src/core/hle/service/am/applets/applets.h
+++ b/src/core/hle/service/am/applets/applets.h
@@ -96,11 +96,11 @@ public:
96 void PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage); 96 void PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage);
97 void PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage); 97 void PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage);
98 98
99 void SignalStateChanged() const; 99 void SignalStateChanged();
100 100
101 Kernel::KReadableEvent* GetNormalDataEvent() const; 101 Kernel::KReadableEvent& GetNormalDataEvent();
102 Kernel::KReadableEvent* GetInteractiveDataEvent() const; 102 Kernel::KReadableEvent& GetInteractiveDataEvent();
103 Kernel::KReadableEvent* GetStateChangedEvent() const; 103 Kernel::KReadableEvent& GetStateChangedEvent();
104 104
105private: 105private:
106 Core::System& system; 106 Core::System& system;
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp
index 5a7d73b48..e1ae726f5 100644
--- a/src/core/hle/service/audio/audout_u.cpp
+++ b/src/core/hle/service/audio/audout_u.cpp
@@ -73,7 +73,7 @@ public:
73 stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, 73 stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate,
74 audio_params.channel_count, std::move(unique_name), [this] { 74 audio_params.channel_count, std::move(unique_name), [this] {
75 const auto guard = LockService(); 75 const auto guard = LockService();
76 buffer_event.GetWritableEvent()->Signal(); 76 buffer_event.GetWritableEvent().Signal();
77 }); 77 });
78 } 78 }
79 79
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index b0a362f52..513bd3730 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -55,7 +55,7 @@ public:
55 system.CoreTiming(), system.Memory(), audren_params, 55 system.CoreTiming(), system.Memory(), audren_params,
56 [this]() { 56 [this]() {
57 const auto guard = LockService(); 57 const auto guard = LockService();
58 system_event.GetWritableEvent()->Signal(); 58 system_event.GetWritableEvent().Signal();
59 }, 59 },
60 instance_number); 60 instance_number);
61 } 61 }
@@ -289,7 +289,7 @@ private:
289 void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { 289 void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) {
290 LOG_WARNING(Service_Audio, "(STUBBED) called"); 290 LOG_WARNING(Service_Audio, "(STUBBED) called");
291 291
292 buffer_event.GetWritableEvent()->Signal(); 292 buffer_event.GetWritableEvent().Signal();
293 293
294 IPC::ResponseBuilder rb{ctx, 2, 1}; 294 IPC::ResponseBuilder rb{ctx, 2, 1};
295 rb.Push(RESULT_SUCCESS); 295 rb.Push(RESULT_SUCCESS);
diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp
index 8def52b31..0e935bfa6 100644
--- a/src/core/hle/service/bcat/backend/backend.cpp
+++ b/src/core/hle/service/bcat/backend/backend.cpp
@@ -19,7 +19,7 @@ ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel,
19 update_event.Initialize("ProgressServiceBackend:UpdateEvent:" + std::string(event_name)); 19 update_event.Initialize("ProgressServiceBackend:UpdateEvent:" + std::string(event_name));
20} 20}
21 21
22std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { 22Kernel::KReadableEvent& ProgressServiceBackend::GetEvent() {
23 return update_event.GetReadableEvent(); 23 return update_event.GetReadableEvent();
24} 24}
25 25
@@ -85,12 +85,12 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) {
85 SignalUpdate(); 85 SignalUpdate();
86} 86}
87 87
88void ProgressServiceBackend::SignalUpdate() const { 88void ProgressServiceBackend::SignalUpdate() {
89 if (need_hle_lock) { 89 if (need_hle_lock) {
90 std::lock_guard lock(HLE::g_hle_lock); 90 std::lock_guard lock(HLE::g_hle_lock);
91 update_event.GetWritableEvent()->Signal(); 91 update_event.GetWritableEvent().Signal();
92 } else { 92 } else {
93 update_event.GetWritableEvent()->Signal(); 93 update_event.GetWritableEvent().Signal();
94 } 94 }
95} 95}
96 96
diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h
index baa4d576a..f591a362a 100644
--- a/src/core/hle/service/bcat/backend/backend.h
+++ b/src/core/hle/service/bcat/backend/backend.h
@@ -99,10 +99,10 @@ public:
99private: 99private:
100 explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name); 100 explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name);
101 101
102 std::shared_ptr<Kernel::KReadableEvent> GetEvent() const; 102 Kernel::KReadableEvent& GetEvent();
103 DeliveryCacheProgressImpl& GetImpl(); 103 DeliveryCacheProgressImpl& GetImpl();
104 104
105 void SignalUpdate() const; 105 void SignalUpdate();
106 106
107 DeliveryCacheProgressImpl impl{}; 107 DeliveryCacheProgressImpl impl{};
108 Kernel::KEvent update_event; 108 Kernel::KEvent update_event;
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp
index 8473b716b..05635a2a5 100644
--- a/src/core/hle/service/bcat/module.cpp
+++ b/src/core/hle/service/bcat/module.cpp
@@ -88,11 +88,9 @@ struct DeliveryCacheDirectoryEntry {
88 88
89class IDeliveryCacheProgressService final : public ServiceFramework<IDeliveryCacheProgressService> { 89class IDeliveryCacheProgressService final : public ServiceFramework<IDeliveryCacheProgressService> {
90public: 90public:
91 explicit IDeliveryCacheProgressService(Core::System& system_, 91 explicit IDeliveryCacheProgressService(Core::System& system_, Kernel::KReadableEvent& event_,
92 std::shared_ptr<Kernel::KReadableEvent> event_,
93 const DeliveryCacheProgressImpl& impl_) 92 const DeliveryCacheProgressImpl& impl_)
94 : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{std::move(event_)}, 93 : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} {
95 impl{impl_} {
96 // clang-format off 94 // clang-format off
97 static const FunctionInfo functions[] = { 95 static const FunctionInfo functions[] = {
98 {0, &IDeliveryCacheProgressService::GetEvent, "GetEvent"}, 96 {0, &IDeliveryCacheProgressService::GetEvent, "GetEvent"},
@@ -109,7 +107,7 @@ private:
109 107
110 IPC::ResponseBuilder rb{ctx, 2, 1}; 108 IPC::ResponseBuilder rb{ctx, 2, 1};
111 rb.Push(RESULT_SUCCESS); 109 rb.Push(RESULT_SUCCESS);
112 rb.PushCopyObjects(event.get()); 110 rb.PushCopyObjects(event);
113 } 111 }
114 112
115 void GetImpl(Kernel::HLERequestContext& ctx) { 113 void GetImpl(Kernel::HLERequestContext& ctx) {
@@ -121,7 +119,7 @@ private:
121 rb.Push(RESULT_SUCCESS); 119 rb.Push(RESULT_SUCCESS);
122 } 120 }
123 121
124 std::shared_ptr<Kernel::KReadableEvent> event; 122 Kernel::KReadableEvent& event;
125 const DeliveryCacheProgressImpl& impl; 123 const DeliveryCacheProgressImpl& impl;
126}; 124};
127 125
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 77768ca7d..7acad3798 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -159,7 +159,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) {
159 const auto controller_type = connected_controllers[controller_idx].type; 159 const auto controller_type = connected_controllers[controller_idx].type;
160 auto& controller = shared_memory_entries[controller_idx]; 160 auto& controller = shared_memory_entries[controller_idx];
161 if (controller_type == NPadControllerType::None) { 161 if (controller_type == NPadControllerType::None) {
162 styleset_changed_events[controller_idx]->GetWritableEvent()->Signal(); 162 styleset_changed_events[controller_idx]->GetWritableEvent().Signal();
163 return; 163 return;
164 } 164 }
165 controller.style_set.raw = 0; // Zero out 165 controller.style_set.raw = 0; // Zero out
@@ -959,13 +959,12 @@ bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_dev
959 return vibration_devices_mounted[npad_index][device_index]; 959 return vibration_devices_mounted[npad_index][device_index];
960} 960}
961 961
962Kernel::KReadableEvent* Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) const { 962Kernel::KReadableEvent& Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) {
963 const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; 963 return styleset_changed_events[NPadIdToIndex(npad_id)]->GetReadableEvent();
964 return styleset_event->GetReadableEvent();
965} 964}
966 965
967void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { 966void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const {
968 styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent()->Signal(); 967 styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent().Signal();
969} 968}
970 969
971void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) { 970void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) {
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index b3de272b6..b0f575561 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -199,7 +199,7 @@ public:
199 199
200 bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const; 200 bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const;
201 201
202 Kernel::KReadableEvent* GetStyleSetChangedEvent(u32 npad_id) const; 202 Kernel::KReadableEvent& GetStyleSetChangedEvent(u32 npad_id);
203 void SignalStyleSetChangedEvent(u32 npad_id) const; 203 void SignalStyleSetChangedEvent(u32 npad_id) const;
204 204
205 // Adds a new controller at an index. 205 // Adds a new controller at an index.
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index d1cf01390..d25b20ab5 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -175,7 +175,7 @@ private:
175 switch (device_state) { 175 switch (device_state) {
176 case DeviceState::TagFound: 176 case DeviceState::TagFound:
177 case DeviceState::TagNearby: 177 case DeviceState::TagNearby:
178 deactivate_event.GetWritableEvent()->Signal(); 178 deactivate_event.GetWritableEvent().Signal();
179 device_state = DeviceState::Initialized; 179 device_state = DeviceState::Initialized;
180 break; 180 break;
181 case DeviceState::SearchingForTag: 181 case DeviceState::SearchingForTag:
@@ -318,7 +318,7 @@ private:
318 const u32 npad_id{0}; // Player 1 controller 318 const u32 npad_id{0}; // Player 1 controller
319 State state{State::NonInitialized}; 319 State state{State::NonInitialized};
320 DeviceState device_state{DeviceState::Initialized}; 320 DeviceState device_state{DeviceState::Initialized};
321 const Module::Interface& nfp_interface; 321 Module::Interface& nfp_interface;
322 Kernel::KEvent deactivate_event; 322 Kernel::KEvent deactivate_event;
323 Kernel::KEvent availability_change_event; 323 Kernel::KEvent availability_change_event;
324}; 324};
@@ -338,12 +338,12 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
338 } 338 }
339 339
340 std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); 340 std::memcpy(&amiibo, buffer.data(), sizeof(amiibo));
341 nfc_tag_load.GetWritableEvent()->Signal(); 341 nfc_tag_load.GetWritableEvent().Signal();
342 return true; 342 return true;
343} 343}
344 344
345Kernel::KReadableEvent* Module::Interface::GetNFCEvent() const { 345Kernel::KReadableEvent& Module::Interface::GetNFCEvent() {
346 return nfc_tag_load.GetReadableEvent().get(); 346 return nfc_tag_load.GetReadableEvent();
347} 347}
348 348
349const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { 349const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const {
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h
index 4bca2192c..5e4e49bc6 100644
--- a/src/core/hle/service/nfp/nfp.h
+++ b/src/core/hle/service/nfp/nfp.h
@@ -39,7 +39,7 @@ public:
39 39
40 void CreateUserInterface(Kernel::HLERequestContext& ctx); 40 void CreateUserInterface(Kernel::HLERequestContext& ctx);
41 bool LoadAmiibo(const std::vector<u8>& buffer); 41 bool LoadAmiibo(const std::vector<u8>& buffer);
42 Kernel::KReadableEvent* GetNFCEvent() const; 42 Kernel::KReadableEvent& GetNFCEvent();
43 const AmiiboFile& GetAmiiboBuffer() const; 43 const AmiiboFile& GetAmiiboBuffer() const;
44 44
45 private: 45 private:
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index 4a2262562..420a5a075 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -323,7 +323,7 @@ private:
323 void StartTask(Kernel::HLERequestContext& ctx) { 323 void StartTask(Kernel::HLERequestContext& ctx) {
324 // No need to connect to the internet, just finish the task straight away. 324 // No need to connect to the internet, just finish the task straight away.
325 LOG_DEBUG(Service_NIM, "called"); 325 LOG_DEBUG(Service_NIM, "called");
326 finished_event.GetWritableEvent()->Signal(); 326 finished_event.GetWritableEvent().Signal();
327 IPC::ResponseBuilder rb{ctx, 2}; 327 IPC::ResponseBuilder rb{ctx, 2};
328 rb.Push(RESULT_SUCCESS); 328 rb.Push(RESULT_SUCCESS);
329 } 329 }
@@ -345,7 +345,7 @@ private:
345 345
346 void Cancel(Kernel::HLERequestContext& ctx) { 346 void Cancel(Kernel::HLERequestContext& ctx) {
347 LOG_DEBUG(Service_NIM, "called"); 347 LOG_DEBUG(Service_NIM, "called");
348 finished_event.GetWritableEvent()->Clear(); 348 finished_event.GetWritableEvent().Clear();
349 IPC::ResponseBuilder rb{ctx, 2}; 349 IPC::ResponseBuilder rb{ctx, 2};
350 rb.Push(RESULT_SUCCESS); 350 rb.Push(RESULT_SUCCESS);
351 } 351 }
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
index e99da24ab..775e76330 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp
@@ -108,14 +108,14 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector
108 // This is mostly to take into account unimplemented features. As synced 108 // This is mostly to take into account unimplemented features. As synced
109 // gpu is always synced. 109 // gpu is always synced.
110 if (!gpu.IsAsync()) { 110 if (!gpu.IsAsync()) {
111 event.event->GetWritableEvent()->Signal(); 111 event.event->GetWritableEvent().Signal();
112 return NvResult::Success; 112 return NvResult::Success;
113 } 113 }
114 auto lock = gpu.LockSync(); 114 auto lock = gpu.LockSync();
115 const u32 current_syncpoint_value = event.fence.value; 115 const u32 current_syncpoint_value = event.fence.value;
116 const s32 diff = current_syncpoint_value - params.threshold; 116 const s32 diff = current_syncpoint_value - params.threshold;
117 if (diff >= 0) { 117 if (diff >= 0) {
118 event.event->GetWritableEvent()->Signal(); 118 event.event->GetWritableEvent().Signal();
119 params.value = current_syncpoint_value; 119 params.value = current_syncpoint_value;
120 std::memcpy(output.data(), &params, sizeof(params)); 120 std::memcpy(output.data(), &params, sizeof(params));
121 return NvResult::Success; 121 return NvResult::Success;
@@ -142,7 +142,7 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector
142 params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; 142 params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000;
143 } 143 }
144 params.value |= event_id; 144 params.value |= event_id;
145 event.event->GetWritableEvent()->Clear(); 145 event.event->GetWritableEvent().Clear();
146 gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); 146 gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value);
147 std::memcpy(output.data(), &params, sizeof(params)); 147 std::memcpy(output.data(), &params, sizeof(params));
148 return NvResult::Timeout; 148 return NvResult::Timeout;
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp
index 8e359040f..dc9b9341f 100644
--- a/src/core/hle/service/nvdrv/interface.cpp
+++ b/src/core/hle/service/nvdrv/interface.cpp
@@ -187,9 +187,9 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) {
187 if (event_id < MaxNvEvents) { 187 if (event_id < MaxNvEvents) {
188 IPC::ResponseBuilder rb{ctx, 3, 1}; 188 IPC::ResponseBuilder rb{ctx, 3, 1};
189 rb.Push(RESULT_SUCCESS); 189 rb.Push(RESULT_SUCCESS);
190 auto event = nvdrv->GetEvent(event_id); 190 auto& event = nvdrv->GetEvent(event_id);
191 event->Clear(); 191 event.Clear();
192 rb.PushCopyObjects(event.get()); 192 rb.PushCopyObjects(event);
193 rb.PushEnum(NvResult::Success); 193 rb.PushEnum(NvResult::Success);
194 } else { 194 } else {
195 IPC::ResponseBuilder rb{ctx, 3}; 195 IPC::ResponseBuilder rb{ctx, 3};
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp
index 2fbf61cd6..74796dce1 100644
--- a/src/core/hle/service/nvdrv/nvdrv.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv.cpp
@@ -176,16 +176,16 @@ void Module::SignalSyncpt(const u32 syncpoint_id, const u32 value) {
176 if (events_interface.assigned_syncpt[i] == syncpoint_id && 176 if (events_interface.assigned_syncpt[i] == syncpoint_id &&
177 events_interface.assigned_value[i] == value) { 177 events_interface.assigned_value[i] == value) {
178 events_interface.LiberateEvent(i); 178 events_interface.LiberateEvent(i);
179 events_interface.events[i].event->GetWritableEvent()->Signal(); 179 events_interface.events[i].event->GetWritableEvent().Signal();
180 } 180 }
181 } 181 }
182} 182}
183 183
184std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { 184Kernel::KReadableEvent& Module::GetEvent(const u32 event_id) {
185 return SharedFrom(events_interface.events[event_id].event->GetReadableEvent()); 185 return events_interface.events[event_id].event->GetReadableEvent();
186} 186}
187 187
188std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { 188Kernel::KWritableEvent& Module::GetEventWriteable(const u32 event_id) {
189 return events_interface.events[event_id].event->GetWritableEvent(); 189 return events_interface.events[event_id].event->GetWritableEvent();
190} 190}
191 191
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h
index ea5dbbdf9..a43ceb7ae 100644
--- a/src/core/hle/service/nvdrv/nvdrv.h
+++ b/src/core/hle/service/nvdrv/nvdrv.h
@@ -136,9 +136,9 @@ public:
136 136
137 void SignalSyncpt(const u32 syncpoint_id, const u32 value); 137 void SignalSyncpt(const u32 syncpoint_id, const u32 value);
138 138
139 std::shared_ptr<Kernel::KReadableEvent> GetEvent(u32 event_id) const; 139 Kernel::KReadableEvent& GetEvent(u32 event_id);
140 140
141 std::shared_ptr<Kernel::KWritableEvent> GetEventWriteable(u32 event_id) const; 141 Kernel::KWritableEvent& GetEventWriteable(u32 event_id);
142 142
143private: 143private:
144 /// Manages syncpoints on the host 144 /// Manages syncpoints on the host
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp
index 95e5a5e7f..0b6e7430b 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue.cpp
@@ -41,7 +41,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer)
41 .multi_fence = {}, 41 .multi_fence = {},
42 }; 42 };
43 43
44 buffer_wait_event.GetWritableEvent()->Signal(); 44 buffer_wait_event.GetWritableEvent().Signal();
45} 45}
46 46
47std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, 47std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width,
@@ -119,7 +119,7 @@ void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& mult
119 } 119 }
120 free_buffers_condition.notify_one(); 120 free_buffers_condition.notify_one();
121 121
122 buffer_wait_event.GetWritableEvent()->Signal(); 122 buffer_wait_event.GetWritableEvent().Signal();
123} 123}
124 124
125std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { 125std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
@@ -154,7 +154,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
154 } 154 }
155 free_buffers_condition.notify_one(); 155 free_buffers_condition.notify_one();
156 156
157 buffer_wait_event.GetWritableEvent()->Signal(); 157 buffer_wait_event.GetWritableEvent().Signal();
158} 158}
159 159
160void BufferQueue::Connect() { 160void BufferQueue::Connect() {
@@ -169,7 +169,7 @@ void BufferQueue::Disconnect() {
169 std::unique_lock lock{queue_sequence_mutex}; 169 std::unique_lock lock{queue_sequence_mutex};
170 queue_sequence.clear(); 170 queue_sequence.clear();
171 } 171 }
172 buffer_wait_event.GetWritableEvent()->Signal(); 172 buffer_wait_event.GetWritableEvent().Signal();
173 is_connect = false; 173 is_connect = false;
174 free_buffers_condition.notify_one(); 174 free_buffers_condition.notify_one();
175} 175}
@@ -188,11 +188,11 @@ u32 BufferQueue::Query(QueryType type) {
188 return 0; 188 return 0;
189} 189}
190 190
191std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { 191Kernel::KWritableEvent& BufferQueue::GetWritableBufferWaitEvent() {
192 return buffer_wait_event.GetWritableEvent(); 192 return buffer_wait_event.GetWritableEvent();
193} 193}
194 194
195std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { 195Kernel::KReadableEvent& BufferQueue::GetBufferWaitEvent() {
196 return buffer_wait_event.GetReadableEvent(); 196 return buffer_wait_event.GetReadableEvent();
197} 197}
198 198
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h
index 0d2010ad5..044e51d08 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -117,9 +117,9 @@ public:
117 return is_connect; 117 return is_connect;
118 } 118 }
119 119
120 std::shared_ptr<Kernel::KWritableEvent> GetWritableBufferWaitEvent() const; 120 Kernel::KWritableEvent& GetWritableBufferWaitEvent();
121 121
122 std::shared_ptr<Kernel::KReadableEvent> GetBufferWaitEvent() const; 122 Kernel::KReadableEvent& GetBufferWaitEvent();
123 123
124private: 124private:
125 BufferQueue(const BufferQueue&) = delete; 125 BufferQueue(const BufferQueue&) = delete;
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index c90e4d083..7fb9133c7 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -165,15 +165,15 @@ std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) co
165 return layer->GetBufferQueue().GetId(); 165 return layer->GetBufferQueue().GetId();
166} 166}
167 167
168std::shared_ptr<Kernel::KReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) { 168Kernel::KReadableEvent* NVFlinger::FindVsyncEvent(u64 display_id) {
169 const auto lock_guard = Lock(); 169 const auto lock_guard = Lock();
170 auto* const display = FindDisplay(display_id); 170 auto* const display = FindDisplay(display_id);
171 171
172 if (display == nullptr) { 172 if (display == nullptr) {
173 return nullptr; 173 return nullptr;
174 } 174 }
175 175
176 return display->GetVSyncEvent(); 176 return &display->GetVSyncEvent();
177} 177}
178 178
179BufferQueue* NVFlinger::FindBufferQueue(u32 id) { 179BufferQueue* NVFlinger::FindBufferQueue(u32 id) {
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h
index d51b905c1..1c0aa8ec4 100644
--- a/src/core/hle/service/nvflinger/nvflinger.h
+++ b/src/core/hle/service/nvflinger/nvflinger.h
@@ -73,7 +73,7 @@ public:
73 /// Gets the vsync event for the specified display. 73 /// Gets the vsync event for the specified display.
74 /// 74 ///
75 /// If an invalid display ID is provided, then nullptr is returned. 75 /// If an invalid display ID is provided, then nullptr is returned.
76 [[nodiscard]] std::shared_ptr<Kernel::KReadableEvent> FindVsyncEvent(u64 display_id); 76 [[nodiscard]] Kernel::KReadableEvent* FindVsyncEvent(u64 display_id);
77 77
78 /// Obtains a buffer queue identified by the ID. 78 /// Obtains a buffer queue identified by the ID.
79 [[nodiscard]] BufferQueue* FindBufferQueue(u32 id); 79 [[nodiscard]] BufferQueue* FindBufferQueue(u32 id);
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp
index 2659ab7d5..bb7af9217 100644
--- a/src/core/hle/service/ptm/psm.cpp
+++ b/src/core/hle/service/ptm/psm.cpp
@@ -41,19 +41,19 @@ public:
41 41
42 void SignalChargerTypeChanged() { 42 void SignalChargerTypeChanged() {
43 if (should_signal && should_signal_charger_type) { 43 if (should_signal && should_signal_charger_type) {
44 state_change_event.GetWritableEvent()->Signal(); 44 state_change_event.GetWritableEvent().Signal();
45 } 45 }
46 } 46 }
47 47
48 void SignalPowerSupplyChanged() { 48 void SignalPowerSupplyChanged() {
49 if (should_signal && should_signal_power_supply) { 49 if (should_signal && should_signal_power_supply) {
50 state_change_event.GetWritableEvent()->Signal(); 50 state_change_event.GetWritableEvent().Signal();
51 } 51 }
52 } 52 }
53 53
54 void SignalBatteryVoltageStateChanged() { 54 void SignalBatteryVoltageStateChanged() {
55 if (should_signal && should_signal_battery_voltage) { 55 if (should_signal && should_signal_battery_voltage) {
56 state_change_event.GetWritableEvent()->Signal(); 56 state_change_event.GetWritableEvent().Signal();
57 } 57 }
58 } 58 }
59 59
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp
index 7c52b6aa7..becbd36c1 100644
--- a/src/core/hle/service/vi/display/vi_display.cpp
+++ b/src/core/hle/service/vi/display/vi_display.cpp
@@ -33,12 +33,12 @@ const Layer& Display::GetLayer(std::size_t index) const {
33 return *layers.at(index); 33 return *layers.at(index);
34} 34}
35 35
36std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { 36Kernel::KReadableEvent& Display::GetVSyncEvent() {
37 return vsync_event.GetReadableEvent(); 37 return vsync_event.GetReadableEvent();
38} 38}
39 39
40void Display::SignalVSyncEvent() { 40void Display::SignalVSyncEvent() {
41 vsync_event.GetWritableEvent()->Signal(); 41 vsync_event.GetWritableEvent().Signal();
42} 42}
43 43
44void Display::CreateLayer(u64 layer_id, NVFlinger::BufferQueue& buffer_queue) { 44void Display::CreateLayer(u64 layer_id, NVFlinger::BufferQueue& buffer_queue) {
diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h
index e990d6809..a09d982bc 100644
--- a/src/core/hle/service/vi/display/vi_display.h
+++ b/src/core/hle/service/vi/display/vi_display.h
@@ -59,7 +59,7 @@ public:
59 const Layer& GetLayer(std::size_t index) const; 59 const Layer& GetLayer(std::size_t index) const;
60 60
61 /// Gets the readable vsync event. 61 /// Gets the readable vsync event.
62 std::shared_ptr<Kernel::KReadableEvent> GetVSyncEvent() const; 62 Kernel::KReadableEvent& GetVSyncEvent();
63 63
64 /// Signals the internal vsync event. 64 /// Signals the internal vsync event.
65 void SignalVSyncEvent(); 65 void SignalVSyncEvent();
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 6e507bfb8..32e47a43e 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -669,12 +669,10 @@ private:
669 669
670 LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); 670 LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown);
671 671
672 const auto& buffer_queue = *nv_flinger.FindBufferQueue(id);
673
674 // TODO(Subv): Find out what this actually is. 672 // TODO(Subv): Find out what this actually is.
675 IPC::ResponseBuilder rb{ctx, 2, 1}; 673 IPC::ResponseBuilder rb{ctx, 2, 1};
676 rb.Push(RESULT_SUCCESS); 674 rb.Push(RESULT_SUCCESS);
677 rb.PushCopyObjects(buffer_queue.GetBufferWaitEvent().get()); 675 rb.PushCopyObjects(nv_flinger.FindBufferQueue(id)->GetBufferWaitEvent());
678 } 676 }
679 677
680 NVFlinger::NVFlinger& nv_flinger; 678 NVFlinger::NVFlinger& nv_flinger;
@@ -1209,7 +1207,7 @@ private:
1209 1207
1210 IPC::ResponseBuilder rb{ctx, 2, 1}; 1208 IPC::ResponseBuilder rb{ctx, 2, 1};
1211 rb.Push(RESULT_SUCCESS); 1209 rb.Push(RESULT_SUCCESS);
1212 rb.PushCopyObjects(vsync_event.get()); 1210 rb.PushCopyObjects(vsync_event);
1213 } 1211 }
1214 1212
1215 void ConvertScalingMode(Kernel::HLERequestContext& ctx) { 1213 void ConvertScalingMode(Kernel::HLERequestContext& ctx) {