summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Liam2022-10-12 20:26:04 -0400
committerGravatar Liam2022-10-12 20:29:29 -0400
commita9ace6856de57f1124daaa77aacd6f36a64c68f7 (patch)
treeacf105c0e57d62889e2ebf88b463a7ebf7adc0b4 /src/core/hle/kernel
parentMerge pull request #9027 from yuzu-emu/revert-8987-another-name-for-reinforce... (diff)
downloadyuzu-a9ace6856de57f1124daaa77aacd6f36a64c68f7.tar.gz
yuzu-a9ace6856de57f1124daaa77aacd6f36a64c68f7.tar.xz
yuzu-a9ace6856de57f1124daaa77aacd6f36a64c68f7.zip
kernel: remove KWritableEvent
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/hle_ipc.h2
-rw-r--r--src/core/hle/kernel/k_class_token.cpp12
-rw-r--r--src/core/hle/kernel/k_class_token.h1
-rw-r--r--src/core/hle/kernel/k_event.cpp44
-rw-r--r--src/core/hle/kernel/k_event.h31
-rw-r--r--src/core/hle/kernel/k_readable_event.cpp33
-rw-r--r--src/core/hle/kernel/k_readable_event.h17
-rw-r--r--src/core/hle/kernel/k_writable_event.cpp35
-rw-r--r--src/core/hle/kernel/k_writable_event.h39
-rw-r--r--src/core/hle/kernel/kernel.h4
-rw-r--r--src/core/hle/kernel/svc.cpp25
11 files changed, 88 insertions, 155 deletions
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 99265ce90..e258e2cdf 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -43,13 +43,13 @@ class Domain;
43class HLERequestContext; 43class HLERequestContext;
44class KAutoObject; 44class KAutoObject;
45class KernelCore; 45class KernelCore;
46class KEvent;
46class KHandleTable; 47class KHandleTable;
47class KProcess; 48class KProcess;
48class KServerSession; 49class KServerSession;
49class KThread; 50class KThread;
50class KReadableEvent; 51class KReadableEvent;
51class KSession; 52class KSession;
52class KWritableEvent;
53class ServiceThread; 53class ServiceThread;
54 54
55enum class ThreadWakeupReason; 55enum class ThreadWakeupReason;
diff --git a/src/core/hle/kernel/k_class_token.cpp b/src/core/hle/kernel/k_class_token.cpp
index cc2a0f7ca..10265c23c 100644
--- a/src/core/hle/kernel/k_class_token.cpp
+++ b/src/core/hle/kernel/k_class_token.cpp
@@ -18,7 +18,6 @@
18#include "core/hle/kernel/k_synchronization_object.h" 18#include "core/hle/kernel/k_synchronization_object.h"
19#include "core/hle/kernel/k_thread.h" 19#include "core/hle/kernel/k_thread.h"
20#include "core/hle/kernel/k_transfer_memory.h" 20#include "core/hle/kernel/k_transfer_memory.h"
21#include "core/hle/kernel/k_writable_event.h"
22 21
23namespace Kernel { 22namespace Kernel {
24 23
@@ -42,13 +41,12 @@ static_assert(ClassToken<KPort> == 0b10000101'00000000);
42static_assert(ClassToken<KSession> == 0b00011001'00000000); 41static_assert(ClassToken<KSession> == 0b00011001'00000000);
43static_assert(ClassToken<KSharedMemory> == 0b00101001'00000000); 42static_assert(ClassToken<KSharedMemory> == 0b00101001'00000000);
44static_assert(ClassToken<KEvent> == 0b01001001'00000000); 43static_assert(ClassToken<KEvent> == 0b01001001'00000000);
45static_assert(ClassToken<KWritableEvent> == 0b10001001'00000000);
46// static_assert(ClassToken<KLightClientSession> == 0b00110001'00000000); 44// static_assert(ClassToken<KLightClientSession> == 0b00110001'00000000);
47// static_assert(ClassToken<KLightServerSession> == 0b01010001'00000000); 45// static_assert(ClassToken<KLightServerSession> == 0b01010001'00000000);
48static_assert(ClassToken<KTransferMemory> == 0b10010001'00000000); 46static_assert(ClassToken<KTransferMemory> == 0b01010001'00000000);
49// static_assert(ClassToken<KDeviceAddressSpace> == 0b01100001'00000000); 47// static_assert(ClassToken<KDeviceAddressSpace> == 0b01100001'00000000);
50// static_assert(ClassToken<KSessionRequest> == 0b10100001'00000000); 48// static_assert(ClassToken<KSessionRequest> == 0b10100001'00000000);
51static_assert(ClassToken<KCodeMemory> == 0b11000001'00000000); 49static_assert(ClassToken<KCodeMemory> == 0b10100001'00000000);
52 50
53// Ensure that the token hierarchy is correct. 51// Ensure that the token hierarchy is correct.
54 52
@@ -73,13 +71,12 @@ static_assert(ClassToken<KPort> == ((0b10000101 << 8) | ClassToken<KAutoObject>)
73static_assert(ClassToken<KSession> == ((0b00011001 << 8) | ClassToken<KAutoObject>)); 71static_assert(ClassToken<KSession> == ((0b00011001 << 8) | ClassToken<KAutoObject>));
74static_assert(ClassToken<KSharedMemory> == ((0b00101001 << 8) | ClassToken<KAutoObject>)); 72static_assert(ClassToken<KSharedMemory> == ((0b00101001 << 8) | ClassToken<KAutoObject>));
75static_assert(ClassToken<KEvent> == ((0b01001001 << 8) | ClassToken<KAutoObject>)); 73static_assert(ClassToken<KEvent> == ((0b01001001 << 8) | ClassToken<KAutoObject>));
76static_assert(ClassToken<KWritableEvent> == ((0b10001001 << 8) | ClassToken<KAutoObject>));
77// static_assert(ClassToken<KLightClientSession> == ((0b00110001 << 8) | ClassToken<KAutoObject>)); 74// static_assert(ClassToken<KLightClientSession> == ((0b00110001 << 8) | ClassToken<KAutoObject>));
78// static_assert(ClassToken<KLightServerSession> == ((0b01010001 << 8) | ClassToken<KAutoObject>)); 75// static_assert(ClassToken<KLightServerSession> == ((0b01010001 << 8) | ClassToken<KAutoObject>));
79static_assert(ClassToken<KTransferMemory> == ((0b10010001 << 8) | ClassToken<KAutoObject>)); 76static_assert(ClassToken<KTransferMemory> == ((0b01010001 << 8) | ClassToken<KAutoObject>));
80// static_assert(ClassToken<KDeviceAddressSpace> == ((0b01100001 << 8) | ClassToken<KAutoObject>)); 77// static_assert(ClassToken<KDeviceAddressSpace> == ((0b01100001 << 8) | ClassToken<KAutoObject>));
81// static_assert(ClassToken<KSessionRequest> == ((0b10100001 << 8) | ClassToken<KAutoObject>)); 78// static_assert(ClassToken<KSessionRequest> == ((0b10100001 << 8) | ClassToken<KAutoObject>));
82static_assert(ClassToken<KCodeMemory> == ((0b11000001 << 8) | ClassToken<KAutoObject>)); 79static_assert(ClassToken<KCodeMemory> == ((0b10100001 << 8) | ClassToken<KAutoObject>));
83 80
84// Ensure that the token hierarchy reflects the class hierarchy. 81// Ensure that the token hierarchy reflects the class hierarchy.
85 82
@@ -110,7 +107,6 @@ static_assert(std::is_final_v<KPort> && std::is_base_of_v<KAutoObject, KPort>);
110static_assert(std::is_final_v<KSession> && std::is_base_of_v<KAutoObject, KSession>); 107static_assert(std::is_final_v<KSession> && std::is_base_of_v<KAutoObject, KSession>);
111static_assert(std::is_final_v<KSharedMemory> && std::is_base_of_v<KAutoObject, KSharedMemory>); 108static_assert(std::is_final_v<KSharedMemory> && std::is_base_of_v<KAutoObject, KSharedMemory>);
112static_assert(std::is_final_v<KEvent> && std::is_base_of_v<KAutoObject, KEvent>); 109static_assert(std::is_final_v<KEvent> && std::is_base_of_v<KAutoObject, KEvent>);
113static_assert(std::is_final_v<KWritableEvent> && std::is_base_of_v<KAutoObject, KWritableEvent>);
114// static_assert(std::is_final_v<KLightClientSession> && 110// static_assert(std::is_final_v<KLightClientSession> &&
115// std::is_base_of_v<KAutoObject, KLightClientSession>); 111// std::is_base_of_v<KAutoObject, KLightClientSession>);
116// static_assert(std::is_final_v<KLightServerSession> && 112// static_assert(std::is_final_v<KLightServerSession> &&
diff --git a/src/core/hle/kernel/k_class_token.h b/src/core/hle/kernel/k_class_token.h
index c9001ae3d..ab20e00ff 100644
--- a/src/core/hle/kernel/k_class_token.h
+++ b/src/core/hle/kernel/k_class_token.h
@@ -101,7 +101,6 @@ public:
101 KSession, 101 KSession,
102 KSharedMemory, 102 KSharedMemory,
103 KEvent, 103 KEvent,
104 KWritableEvent,
105 KLightClientSession, 104 KLightClientSession,
106 KLightServerSession, 105 KLightServerSession,
107 KTransferMemory, 106 KTransferMemory,
diff --git a/src/core/hle/kernel/k_event.cpp b/src/core/hle/kernel/k_event.cpp
index e52fafbc7..78ca59463 100644
--- a/src/core/hle/kernel/k_event.cpp
+++ b/src/core/hle/kernel/k_event.cpp
@@ -8,39 +8,45 @@
8namespace Kernel { 8namespace Kernel {
9 9
10KEvent::KEvent(KernelCore& kernel_) 10KEvent::KEvent(KernelCore& kernel_)
11 : KAutoObjectWithSlabHeapAndContainer{kernel_}, readable_event{kernel_}, writable_event{ 11 : KAutoObjectWithSlabHeapAndContainer{kernel_}, m_readable_event{kernel_} {}
12 kernel_} {}
13 12
14KEvent::~KEvent() = default; 13KEvent::~KEvent() = default;
15 14
16void KEvent::Initialize(std::string&& name_, KProcess* owner_) { 15void KEvent::Initialize(KProcess* owner) {
17 // Increment reference count. 16 // Create our readable event.
18 // Because reference count is one on creation, this will result 17 KAutoObject::Create(std::addressof(m_readable_event));
19 // in a reference count of two. Thus, when both readable and
20 // writable events are closed this object will be destroyed.
21 Open();
22 18
23 // Create our sub events. 19 // Initialize our readable event.
24 KAutoObject::Create(std::addressof(readable_event)); 20 m_readable_event.Initialize(this);
25 KAutoObject::Create(std::addressof(writable_event));
26
27 // Initialize our sub sessions.
28 readable_event.Initialize(this, name_ + ":Readable");
29 writable_event.Initialize(this, name_ + ":Writable");
30 21
31 // Set our owner process. 22 // Set our owner process.
32 owner = owner_; 23 m_owner = owner;
33 owner->Open(); 24 m_owner->Open();
34 25
35 // Mark initialized. 26 // Mark initialized.
36 name = std::move(name_); 27 m_initialized = true;
37 initialized = true;
38} 28}
39 29
40void KEvent::Finalize() { 30void KEvent::Finalize() {
41 KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize(); 31 KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize();
42} 32}
43 33
34Result KEvent::Signal() {
35 KScopedSchedulerLock sl{kernel};
36
37 R_SUCCEED_IF(m_readable_event_destroyed);
38
39 return m_readable_event.Signal();
40}
41
42Result KEvent::Clear() {
43 KScopedSchedulerLock sl{kernel};
44
45 R_SUCCEED_IF(m_readable_event_destroyed);
46
47 return m_readable_event.Clear();
48}
49
44void KEvent::PostDestroy(uintptr_t arg) { 50void KEvent::PostDestroy(uintptr_t arg) {
45 // Release the event count resource the owner process holds. 51 // Release the event count resource the owner process holds.
46 KProcess* owner = reinterpret_cast<KProcess*>(arg); 52 KProcess* owner = reinterpret_cast<KProcess*>(arg);
diff --git a/src/core/hle/kernel/k_event.h b/src/core/hle/kernel/k_event.h
index 2ff828feb..48ce7d9a0 100644
--- a/src/core/hle/kernel/k_event.h
+++ b/src/core/hle/kernel/k_event.h
@@ -4,14 +4,12 @@
4#pragma once 4#pragma once
5 5
6#include "core/hle/kernel/k_readable_event.h" 6#include "core/hle/kernel/k_readable_event.h"
7#include "core/hle/kernel/k_writable_event.h"
8#include "core/hle/kernel/slab_helpers.h" 7#include "core/hle/kernel/slab_helpers.h"
9 8
10namespace Kernel { 9namespace Kernel {
11 10
12class KernelCore; 11class KernelCore;
13class KReadableEvent; 12class KReadableEvent;
14class KWritableEvent;
15class KProcess; 13class KProcess;
16 14
17class KEvent final : public KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList> { 15class KEvent final : public KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList> {
@@ -21,37 +19,40 @@ public:
21 explicit KEvent(KernelCore& kernel_); 19 explicit KEvent(KernelCore& kernel_);
22 ~KEvent() override; 20 ~KEvent() override;
23 21
24 void Initialize(std::string&& name, KProcess* owner_); 22 void Initialize(KProcess* owner);
25 23
26 void Finalize() override; 24 void Finalize() override;
27 25
28 bool IsInitialized() const override { 26 bool IsInitialized() const override {
29 return initialized; 27 return m_initialized;
30 } 28 }
31 29
32 uintptr_t GetPostDestroyArgument() const override { 30 uintptr_t GetPostDestroyArgument() const override {
33 return reinterpret_cast<uintptr_t>(owner); 31 return reinterpret_cast<uintptr_t>(m_owner);
34 } 32 }
35 33
36 KProcess* GetOwner() const override { 34 KProcess* GetOwner() const override {
37 return owner; 35 return m_owner;
38 } 36 }
39 37
40 KReadableEvent& GetReadableEvent() { 38 KReadableEvent& GetReadableEvent() {
41 return readable_event; 39 return m_readable_event;
42 }
43
44 KWritableEvent& GetWritableEvent() {
45 return writable_event;
46 } 40 }
47 41
48 static void PostDestroy(uintptr_t arg); 42 static void PostDestroy(uintptr_t arg);
49 43
44 Result Signal();
45 Result Clear();
46
47 void OnReadableEventDestroyed() {
48 m_readable_event_destroyed = true;
49 }
50
50private: 51private:
51 KReadableEvent readable_event; 52 KReadableEvent m_readable_event;
52 KWritableEvent writable_event; 53 KProcess* m_owner{};
53 KProcess* owner{}; 54 bool m_initialized{};
54 bool initialized{}; 55 bool m_readable_event_destroyed{};
55}; 56};
56 57
57} // namespace Kernel 58} // namespace Kernel
diff --git a/src/core/hle/kernel/k_readable_event.cpp b/src/core/hle/kernel/k_readable_event.cpp
index 94c5464fe..5c942d47c 100644
--- a/src/core/hle/kernel/k_readable_event.cpp
+++ b/src/core/hle/kernel/k_readable_event.cpp
@@ -15,31 +15,44 @@ KReadableEvent::KReadableEvent(KernelCore& kernel_) : KSynchronizationObject{ker
15 15
16KReadableEvent::~KReadableEvent() = default; 16KReadableEvent::~KReadableEvent() = default;
17 17
18void KReadableEvent::Initialize(KEvent* parent) {
19 m_is_signaled = false;
20 m_parent = parent;
21
22 if (m_parent != nullptr) {
23 m_parent->Open();
24 }
25}
26
18bool KReadableEvent::IsSignaled() const { 27bool KReadableEvent::IsSignaled() const {
19 ASSERT(kernel.GlobalSchedulerContext().IsLocked()); 28 ASSERT(KScheduler::IsSchedulerLockedByCurrentThread(kernel));
20 29
21 return is_signaled; 30 return m_is_signaled;
22} 31}
23 32
24void KReadableEvent::Destroy() { 33void KReadableEvent::Destroy() {
25 if (parent) { 34 if (m_parent) {
26 parent->Close(); 35 {
36 KScopedSchedulerLock sl{kernel};
37 m_parent->OnReadableEventDestroyed();
38 }
39 m_parent->Close();
27 } 40 }
28} 41}
29 42
30Result KReadableEvent::Signal() { 43Result KReadableEvent::Signal() {
31 KScopedSchedulerLock lk{kernel}; 44 KScopedSchedulerLock lk{kernel};
32 45
33 if (!is_signaled) { 46 if (!m_is_signaled) {
34 is_signaled = true; 47 m_is_signaled = true;
35 NotifyAvailable(); 48 this->NotifyAvailable();
36 } 49 }
37 50
38 return ResultSuccess; 51 return ResultSuccess;
39} 52}
40 53
41Result KReadableEvent::Clear() { 54Result KReadableEvent::Clear() {
42 Reset(); 55 this->Reset();
43 56
44 return ResultSuccess; 57 return ResultSuccess;
45} 58}
@@ -47,11 +60,11 @@ Result KReadableEvent::Clear() {
47Result KReadableEvent::Reset() { 60Result KReadableEvent::Reset() {
48 KScopedSchedulerLock lk{kernel}; 61 KScopedSchedulerLock lk{kernel};
49 62
50 if (!is_signaled) { 63 if (!m_is_signaled) {
51 return ResultInvalidState; 64 return ResultInvalidState;
52 } 65 }
53 66
54 is_signaled = false; 67 m_is_signaled = false;
55 return ResultSuccess; 68 return ResultSuccess;
56} 69}
57 70
diff --git a/src/core/hle/kernel/k_readable_event.h b/src/core/hle/kernel/k_readable_event.h
index 18dcad289..743f96bf5 100644
--- a/src/core/hle/kernel/k_readable_event.h
+++ b/src/core/hle/kernel/k_readable_event.h
@@ -20,26 +20,23 @@ public:
20 explicit KReadableEvent(KernelCore& kernel_); 20 explicit KReadableEvent(KernelCore& kernel_);
21 ~KReadableEvent() override; 21 ~KReadableEvent() override;
22 22
23 void Initialize(KEvent* parent_event_, std::string&& name_) { 23 void Initialize(KEvent* parent);
24 is_signaled = false;
25 parent = parent_event_;
26 name = std::move(name_);
27 }
28 24
29 KEvent* GetParent() const { 25 KEvent* GetParent() const {
30 return parent; 26 return m_parent;
31 } 27 }
32 28
29 Result Signal();
30 Result Clear();
31
33 bool IsSignaled() const override; 32 bool IsSignaled() const override;
34 void Destroy() override; 33 void Destroy() override;
35 34
36 Result Signal();
37 Result Clear();
38 Result Reset(); 35 Result Reset();
39 36
40private: 37private:
41 bool is_signaled{}; 38 bool m_is_signaled{};
42 KEvent* parent{}; 39 KEvent* m_parent{};
43}; 40};
44 41
45} // namespace Kernel 42} // namespace Kernel
diff --git a/src/core/hle/kernel/k_writable_event.cpp b/src/core/hle/kernel/k_writable_event.cpp
deleted file mode 100644
index ff88c5acd..000000000
--- a/src/core/hle/kernel/k_writable_event.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/kernel/k_event.h"
5#include "core/hle/kernel/k_readable_event.h"
6#include "core/hle/kernel/k_writable_event.h"
7
8namespace Kernel {
9
10KWritableEvent::KWritableEvent(KernelCore& kernel_)
11 : KAutoObjectWithSlabHeapAndContainer{kernel_} {}
12
13KWritableEvent::~KWritableEvent() = default;
14
15void KWritableEvent::Initialize(KEvent* parent_event_, std::string&& name_) {
16 parent = parent_event_;
17 name = std::move(name_);
18 parent->GetReadableEvent().Open();
19}
20
21Result KWritableEvent::Signal() {
22 return parent->GetReadableEvent().Signal();
23}
24
25Result KWritableEvent::Clear() {
26 return parent->GetReadableEvent().Clear();
27}
28
29void KWritableEvent::Destroy() {
30 // Close our references.
31 parent->GetReadableEvent().Close();
32 parent->Close();
33}
34
35} // namespace Kernel
diff --git a/src/core/hle/kernel/k_writable_event.h b/src/core/hle/kernel/k_writable_event.h
deleted file mode 100644
index 3fd0c7d0a..000000000
--- a/src/core/hle/kernel/k_writable_event.h
+++ /dev/null
@@ -1,39 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/kernel/k_auto_object.h"
7#include "core/hle/kernel/slab_helpers.h"
8#include "core/hle/result.h"
9
10namespace Kernel {
11
12class KernelCore;
13class KEvent;
14
15class KWritableEvent final
16 : public KAutoObjectWithSlabHeapAndContainer<KWritableEvent, KAutoObjectWithList> {
17 KERNEL_AUTOOBJECT_TRAITS(KWritableEvent, KAutoObject);
18
19public:
20 explicit KWritableEvent(KernelCore& kernel_);
21 ~KWritableEvent() override;
22
23 void Destroy() override;
24
25 static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
26
27 void Initialize(KEvent* parent_, std::string&& name_);
28 Result Signal();
29 Result Clear();
30
31 KEvent* GetParent() const {
32 return parent;
33 }
34
35private:
36 KEvent* parent{};
37};
38
39} // namespace Kernel
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index bcf016a97..0847cbcbf 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -52,7 +52,6 @@ class KThread;
52class KThreadLocalPage; 52class KThreadLocalPage;
53class KTransferMemory; 53class KTransferMemory;
54class KWorkerTaskManager; 54class KWorkerTaskManager;
55class KWritableEvent;
56class KCodeMemory; 55class KCodeMemory;
57class PhysicalCore; 56class PhysicalCore;
58class ServiceThread; 57class ServiceThread;
@@ -345,8 +344,6 @@ public:
345 return slab_heap_container->thread; 344 return slab_heap_container->thread;
346 } else if constexpr (std::is_same_v<T, KTransferMemory>) { 345 } else if constexpr (std::is_same_v<T, KTransferMemory>) {
347 return slab_heap_container->transfer_memory; 346 return slab_heap_container->transfer_memory;
348 } else if constexpr (std::is_same_v<T, KWritableEvent>) {
349 return slab_heap_container->writeable_event;
350 } else if constexpr (std::is_same_v<T, KCodeMemory>) { 347 } else if constexpr (std::is_same_v<T, KCodeMemory>) {
351 return slab_heap_container->code_memory; 348 return slab_heap_container->code_memory;
352 } else if constexpr (std::is_same_v<T, KPageBuffer>) { 349 } else if constexpr (std::is_same_v<T, KPageBuffer>) {
@@ -412,7 +409,6 @@ private:
412 KSlabHeap<KSharedMemoryInfo> shared_memory_info; 409 KSlabHeap<KSharedMemoryInfo> shared_memory_info;
413 KSlabHeap<KThread> thread; 410 KSlabHeap<KThread> thread;
414 KSlabHeap<KTransferMemory> transfer_memory; 411 KSlabHeap<KTransferMemory> transfer_memory;
415 KSlabHeap<KWritableEvent> writeable_event;
416 KSlabHeap<KCodeMemory> code_memory; 412 KSlabHeap<KCodeMemory> code_memory;
417 KSlabHeap<KPageBuffer> page_buffer; 413 KSlabHeap<KPageBuffer> page_buffer;
418 KSlabHeap<KThreadLocalPage> thread_local_page; 414 KSlabHeap<KThreadLocalPage> thread_local_page;
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 27e5a805d..035607daf 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -34,7 +34,6 @@
34#include "core/hle/kernel/k_thread.h" 34#include "core/hle/kernel/k_thread.h"
35#include "core/hle/kernel/k_thread_queue.h" 35#include "core/hle/kernel/k_thread_queue.h"
36#include "core/hle/kernel/k_transfer_memory.h" 36#include "core/hle/kernel/k_transfer_memory.h"
37#include "core/hle/kernel/k_writable_event.h"
38#include "core/hle/kernel/kernel.h" 37#include "core/hle/kernel/kernel.h"
39#include "core/hle/kernel/physical_core.h" 38#include "core/hle/kernel/physical_core.h"
40#include "core/hle/kernel/svc.h" 39#include "core/hle/kernel/svc.h"
@@ -2303,11 +2302,11 @@ static Result SignalEvent(Core::System& system, Handle event_handle) {
2303 // Get the current handle table. 2302 // Get the current handle table.
2304 const KHandleTable& handle_table = system.Kernel().CurrentProcess()->GetHandleTable(); 2303 const KHandleTable& handle_table = system.Kernel().CurrentProcess()->GetHandleTable();
2305 2304
2306 // Get the writable event. 2305 // Get the event.
2307 KScopedAutoObject writable_event = handle_table.GetObject<KWritableEvent>(event_handle); 2306 KScopedAutoObject event = handle_table.GetObject<KEvent>(event_handle);
2308 R_UNLESS(writable_event.IsNotNull(), ResultInvalidHandle); 2307 R_UNLESS(event.IsNotNull(), ResultInvalidHandle);
2309 2308
2310 return writable_event->Signal(); 2309 return event->Signal();
2311} 2310}
2312 2311
2313static Result SignalEvent32(Core::System& system, Handle event_handle) { 2312static Result SignalEvent32(Core::System& system, Handle event_handle) {
@@ -2322,9 +2321,9 @@ static Result ClearEvent(Core::System& system, Handle event_handle) {
2322 2321
2323 // Try to clear the writable event. 2322 // Try to clear the writable event.
2324 { 2323 {
2325 KScopedAutoObject writable_event = handle_table.GetObject<KWritableEvent>(event_handle); 2324 KScopedAutoObject event = handle_table.GetObject<KEvent>(event_handle);
2326 if (writable_event.IsNotNull()) { 2325 if (event.IsNotNull()) {
2327 return writable_event->Clear(); 2326 return event->Clear();
2328 } 2327 }
2329 } 2328 }
2330 2329
@@ -2362,24 +2361,24 @@ static Result CreateEvent(Core::System& system, Handle* out_write, Handle* out_r
2362 R_UNLESS(event != nullptr, ResultOutOfResource); 2361 R_UNLESS(event != nullptr, ResultOutOfResource);
2363 2362
2364 // Initialize the event. 2363 // Initialize the event.
2365 event->Initialize("CreateEvent", kernel.CurrentProcess()); 2364 event->Initialize(kernel.CurrentProcess());
2366 2365
2367 // Commit the thread reservation. 2366 // Commit the thread reservation.
2368 event_reservation.Commit(); 2367 event_reservation.Commit();
2369 2368
2370 // Ensure that we clean up the event (and its only references are handle table) on function end. 2369 // Ensure that we clean up the event (and its only references are handle table) on function end.
2371 SCOPE_EXIT({ 2370 SCOPE_EXIT({
2372 event->GetWritableEvent().Close();
2373 event->GetReadableEvent().Close(); 2371 event->GetReadableEvent().Close();
2372 event->Close();
2374 }); 2373 });
2375 2374
2376 // Register the event. 2375 // Register the event.
2377 KEvent::Register(kernel, event); 2376 KEvent::Register(kernel, event);
2378 2377
2379 // Add the writable event to the handle table. 2378 // Add the event to the handle table.
2380 R_TRY(handle_table.Add(out_write, std::addressof(event->GetWritableEvent()))); 2379 R_TRY(handle_table.Add(out_write, event));
2381 2380
2382 // Add the writable event to the handle table. 2381 // Ensure that we maintaing a clean handle state on exit.
2383 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*out_write); }); 2382 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*out_write); });
2384 2383
2385 // Add the readable event to the handle table. 2384 // Add the readable event to the handle table.