diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_class_token.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_class_token.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.cpp | 44 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.h | 31 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_readable_event.cpp | 33 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_readable_event.h | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_writable_event.cpp | 35 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_writable_event.h | 39 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 25 |
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; | |||
| 43 | class HLERequestContext; | 43 | class HLERequestContext; |
| 44 | class KAutoObject; | 44 | class KAutoObject; |
| 45 | class KernelCore; | 45 | class KernelCore; |
| 46 | class KEvent; | ||
| 46 | class KHandleTable; | 47 | class KHandleTable; |
| 47 | class KProcess; | 48 | class KProcess; |
| 48 | class KServerSession; | 49 | class KServerSession; |
| 49 | class KThread; | 50 | class KThread; |
| 50 | class KReadableEvent; | 51 | class KReadableEvent; |
| 51 | class KSession; | 52 | class KSession; |
| 52 | class KWritableEvent; | ||
| 53 | class ServiceThread; | 53 | class ServiceThread; |
| 54 | 54 | ||
| 55 | enum class ThreadWakeupReason; | 55 | enum 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 | ||
| 23 | namespace Kernel { | 22 | namespace Kernel { |
| 24 | 23 | ||
| @@ -42,13 +41,12 @@ static_assert(ClassToken<KPort> == 0b10000101'00000000); | |||
| 42 | static_assert(ClassToken<KSession> == 0b00011001'00000000); | 41 | static_assert(ClassToken<KSession> == 0b00011001'00000000); |
| 43 | static_assert(ClassToken<KSharedMemory> == 0b00101001'00000000); | 42 | static_assert(ClassToken<KSharedMemory> == 0b00101001'00000000); |
| 44 | static_assert(ClassToken<KEvent> == 0b01001001'00000000); | 43 | static_assert(ClassToken<KEvent> == 0b01001001'00000000); |
| 45 | static_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); |
| 48 | static_assert(ClassToken<KTransferMemory> == 0b10010001'00000000); | 46 | static_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); |
| 51 | static_assert(ClassToken<KCodeMemory> == 0b11000001'00000000); | 49 | static_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>) | |||
| 73 | static_assert(ClassToken<KSession> == ((0b00011001 << 8) | ClassToken<KAutoObject>)); | 71 | static_assert(ClassToken<KSession> == ((0b00011001 << 8) | ClassToken<KAutoObject>)); |
| 74 | static_assert(ClassToken<KSharedMemory> == ((0b00101001 << 8) | ClassToken<KAutoObject>)); | 72 | static_assert(ClassToken<KSharedMemory> == ((0b00101001 << 8) | ClassToken<KAutoObject>)); |
| 75 | static_assert(ClassToken<KEvent> == ((0b01001001 << 8) | ClassToken<KAutoObject>)); | 73 | static_assert(ClassToken<KEvent> == ((0b01001001 << 8) | ClassToken<KAutoObject>)); |
| 76 | static_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>)); |
| 79 | static_assert(ClassToken<KTransferMemory> == ((0b10010001 << 8) | ClassToken<KAutoObject>)); | 76 | static_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>)); |
| 82 | static_assert(ClassToken<KCodeMemory> == ((0b11000001 << 8) | ClassToken<KAutoObject>)); | 79 | static_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>); | |||
| 110 | static_assert(std::is_final_v<KSession> && std::is_base_of_v<KAutoObject, KSession>); | 107 | static_assert(std::is_final_v<KSession> && std::is_base_of_v<KAutoObject, KSession>); |
| 111 | static_assert(std::is_final_v<KSharedMemory> && std::is_base_of_v<KAutoObject, KSharedMemory>); | 108 | static_assert(std::is_final_v<KSharedMemory> && std::is_base_of_v<KAutoObject, KSharedMemory>); |
| 112 | static_assert(std::is_final_v<KEvent> && std::is_base_of_v<KAutoObject, KEvent>); | 109 | static_assert(std::is_final_v<KEvent> && std::is_base_of_v<KAutoObject, KEvent>); |
| 113 | static_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 @@ | |||
| 8 | namespace Kernel { | 8 | namespace Kernel { |
| 9 | 9 | ||
| 10 | KEvent::KEvent(KernelCore& kernel_) | 10 | KEvent::KEvent(KernelCore& kernel_) |
| 11 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, readable_event{kernel_}, writable_event{ | 11 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, m_readable_event{kernel_} {} |
| 12 | kernel_} {} | ||
| 13 | 12 | ||
| 14 | KEvent::~KEvent() = default; | 13 | KEvent::~KEvent() = default; |
| 15 | 14 | ||
| 16 | void KEvent::Initialize(std::string&& name_, KProcess* owner_) { | 15 | void 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 | ||
| 40 | void KEvent::Finalize() { | 30 | void KEvent::Finalize() { |
| 41 | KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize(); | 31 | KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize(); |
| 42 | } | 32 | } |
| 43 | 33 | ||
| 34 | Result KEvent::Signal() { | ||
| 35 | KScopedSchedulerLock sl{kernel}; | ||
| 36 | |||
| 37 | R_SUCCEED_IF(m_readable_event_destroyed); | ||
| 38 | |||
| 39 | return m_readable_event.Signal(); | ||
| 40 | } | ||
| 41 | |||
| 42 | Result KEvent::Clear() { | ||
| 43 | KScopedSchedulerLock sl{kernel}; | ||
| 44 | |||
| 45 | R_SUCCEED_IF(m_readable_event_destroyed); | ||
| 46 | |||
| 47 | return m_readable_event.Clear(); | ||
| 48 | } | ||
| 49 | |||
| 44 | void KEvent::PostDestroy(uintptr_t arg) { | 50 | void 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 | ||
| 10 | namespace Kernel { | 9 | namespace Kernel { |
| 11 | 10 | ||
| 12 | class KernelCore; | 11 | class KernelCore; |
| 13 | class KReadableEvent; | 12 | class KReadableEvent; |
| 14 | class KWritableEvent; | ||
| 15 | class KProcess; | 13 | class KProcess; |
| 16 | 14 | ||
| 17 | class KEvent final : public KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList> { | 15 | class 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 | |||
| 50 | private: | 51 | private: |
| 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 | ||
| 16 | KReadableEvent::~KReadableEvent() = default; | 16 | KReadableEvent::~KReadableEvent() = default; |
| 17 | 17 | ||
| 18 | void 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 | |||
| 18 | bool KReadableEvent::IsSignaled() const { | 27 | bool 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 | ||
| 24 | void KReadableEvent::Destroy() { | 33 | void 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 | ||
| 30 | Result KReadableEvent::Signal() { | 43 | Result 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 | ||
| 41 | Result KReadableEvent::Clear() { | 54 | Result KReadableEvent::Clear() { |
| 42 | Reset(); | 55 | this->Reset(); |
| 43 | 56 | ||
| 44 | return ResultSuccess; | 57 | return ResultSuccess; |
| 45 | } | 58 | } |
| @@ -47,11 +60,11 @@ Result KReadableEvent::Clear() { | |||
| 47 | Result KReadableEvent::Reset() { | 60 | Result 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 | ||
| 40 | private: | 37 | private: |
| 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 | |||
| 8 | namespace Kernel { | ||
| 9 | |||
| 10 | KWritableEvent::KWritableEvent(KernelCore& kernel_) | ||
| 11 | : KAutoObjectWithSlabHeapAndContainer{kernel_} {} | ||
| 12 | |||
| 13 | KWritableEvent::~KWritableEvent() = default; | ||
| 14 | |||
| 15 | void KWritableEvent::Initialize(KEvent* parent_event_, std::string&& name_) { | ||
| 16 | parent = parent_event_; | ||
| 17 | name = std::move(name_); | ||
| 18 | parent->GetReadableEvent().Open(); | ||
| 19 | } | ||
| 20 | |||
| 21 | Result KWritableEvent::Signal() { | ||
| 22 | return parent->GetReadableEvent().Signal(); | ||
| 23 | } | ||
| 24 | |||
| 25 | Result KWritableEvent::Clear() { | ||
| 26 | return parent->GetReadableEvent().Clear(); | ||
| 27 | } | ||
| 28 | |||
| 29 | void 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 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class KernelCore; | ||
| 13 | class KEvent; | ||
| 14 | |||
| 15 | class KWritableEvent final | ||
| 16 | : public KAutoObjectWithSlabHeapAndContainer<KWritableEvent, KAutoObjectWithList> { | ||
| 17 | KERNEL_AUTOOBJECT_TRAITS(KWritableEvent, KAutoObject); | ||
| 18 | |||
| 19 | public: | ||
| 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 | |||
| 35 | private: | ||
| 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; | |||
| 52 | class KThreadLocalPage; | 52 | class KThreadLocalPage; |
| 53 | class KTransferMemory; | 53 | class KTransferMemory; |
| 54 | class KWorkerTaskManager; | 54 | class KWorkerTaskManager; |
| 55 | class KWritableEvent; | ||
| 56 | class KCodeMemory; | 55 | class KCodeMemory; |
| 57 | class PhysicalCore; | 56 | class PhysicalCore; |
| 58 | class ServiceThread; | 57 | class 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 | ||
| 2313 | static Result SignalEvent32(Core::System& system, Handle event_handle) { | 2312 | static 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. |