summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
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/core/hle/kernel
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/core/hle/kernel')
-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
9 files changed, 129 insertions, 107 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();