diff options
| author | 2021-04-10 02:34:26 -0700 | |
|---|---|---|
| committer | 2021-05-05 16:40:51 -0700 | |
| commit | 2e8d6fe9a0c07538397682e1cb25992bfd15676d (patch) | |
| tree | 444ee462a197818e0114150a03c0a5898cadaa19 /src/core/hle/kernel | |
| parent | hle: ipc_helpers: Add methods for copy/move references. (diff) | |
| download | yuzu-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.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.h | 33 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_readable_event.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_readable_event.h | 41 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_writable_event.cpp | 18 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_writable_event.h | 34 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 70 |
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 | ||
| 11 | namespace Kernel { | 9 | namespace Kernel { |
| 12 | 10 | ||
| 13 | KEvent::KEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {} | 11 | KEvent::KEvent(KernelCore& kernel) |
| 12 | : KAutoObjectWithSlabHeapAndContainer{kernel}, readable_event{kernel}, writable_event{kernel} {} | ||
| 14 | 13 | ||
| 15 | KEvent::~KEvent() = default; | 14 | KEvent::~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 | ||
| 9 | namespace Kernel { | 11 | namespace 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 | ||
| 61 | private: | 62 | private: |
| 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 | ||
| 16 | namespace Kernel { | 13 | namespace Kernel { |
| 17 | 14 | ||
| 18 | KReadableEvent::KReadableEvent(KernelCore& kernel, std::string&& name) | 15 | KReadableEvent::KReadableEvent(KernelCore& kernel) : KSynchronizationObject{kernel} {} |
| 19 | : KSynchronizationObject{kernel, std::move(name)} {} | 16 | |
| 20 | KReadableEvent::~KReadableEvent() = default; | 17 | KReadableEvent::~KReadableEvent() = default; |
| 21 | 18 | ||
| 22 | bool KReadableEvent::IsSignaled() const { | 19 | bool KReadableEvent::IsSignaled() const { |
| @@ -25,6 +22,12 @@ bool KReadableEvent::IsSignaled() const { | |||
| 25 | return is_signaled; | 22 | return is_signaled; |
| 26 | } | 23 | } |
| 27 | 24 | ||
| 25 | void KReadableEvent::Destroy() { | ||
| 26 | if (parent) { | ||
| 27 | parent->Close(); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 28 | ResultCode KReadableEvent::Signal() { | 31 | ResultCode 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 | ||
| 11 | namespace Kernel { | 13 | namespace Kernel { |
| @@ -13,36 +15,41 @@ namespace Kernel { | |||
| 13 | class KernelCore; | 15 | class KernelCore; |
| 14 | class KEvent; | 16 | class KEvent; |
| 15 | 17 | ||
| 16 | class KReadableEvent final : public KSynchronizationObject { | 18 | class KReadableEvent : public KSynchronizationObject { |
| 19 | KERNEL_AUTOOBJECT_TRAITS(KReadableEvent, KSynchronizationObject); | ||
| 20 | |||
| 17 | public: | 21 | public: |
| 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 | |||
| 46 | private: | 53 | private: |
| 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 | ||
| 9 | namespace Kernel { | 9 | namespace Kernel { |
| 10 | 10 | ||
| 11 | KWritableEvent::KWritableEvent(KernelCore& kernel, std::string&& name) | 11 | KWritableEvent::KWritableEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {} |
| 12 | : Object{kernel, std::move(name)} {} | 12 | |
| 13 | KWritableEvent::~KWritableEvent() = default; | 13 | KWritableEvent::~KWritableEvent() = default; |
| 14 | 14 | ||
| 15 | void KWritableEvent::Initialize(KEvent* parent_) { | 15 | void 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 | ||
| 19 | ResultCode KWritableEvent::Signal() { | 21 | ResultCode KWritableEvent::Signal() { |
| 20 | return parent->GetReadableEvent()->Signal(); | 22 | return parent->GetReadableEvent().Signal(); |
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | ResultCode KWritableEvent::Clear() { | 25 | ResultCode KWritableEvent::Clear() { |
| 24 | return parent->GetReadableEvent()->Clear(); | 26 | return parent->GetReadableEvent().Clear(); |
| 27 | } | ||
| 28 | |||
| 29 | void 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 | ||
| 10 | namespace Kernel { | 12 | namespace Kernel { |
| @@ -12,11 +14,28 @@ namespace Kernel { | |||
| 12 | class KernelCore; | 14 | class KernelCore; |
| 13 | class KEvent; | 15 | class KEvent; |
| 14 | 16 | ||
| 15 | class KWritableEvent final : public Object { | 17 | class KWritableEvent final |
| 18 | : public KAutoObjectWithSlabHeapAndContainer<KWritableEvent, KAutoObjectWithList> { | ||
| 19 | KERNEL_AUTOOBJECT_TRAITS(KWritableEvent, KAutoObject); | ||
| 20 | |||
| 16 | public: | 21 | public: |
| 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 | |||
| 40 | private: | 48 | private: |
| 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; | |||
| 40 | class KScheduler; | 40 | class KScheduler; |
| 41 | class KSharedMemory; | 41 | class KSharedMemory; |
| 42 | class KThread; | 42 | class KThread; |
| 43 | class KWritableEvent; | ||
| 43 | class PhysicalCore; | 44 | class PhysicalCore; |
| 44 | class Process; | 45 | class Process; |
| 45 | class ServiceThread; | 46 | class 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 | |||
| 1885 | static ResultCode SignalEvent(Core::System& system, Handle event_handle) { | 1885 | static 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(); |