diff options
Diffstat (limited to 'src')
35 files changed, 215 insertions, 200 deletions
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp index 58c49460f..cc3210ef2 100644 --- a/src/core/hle/kernel/handle_table.cpp +++ b/src/core/hle/kernel/handle_table.cpp | |||
| @@ -54,7 +54,9 @@ ResultVal<Handle> HandleTable::Create(Object* obj) { | |||
| 54 | case HandleType::SharedMemory: | 54 | case HandleType::SharedMemory: |
| 55 | case HandleType::Thread: | 55 | case HandleType::Thread: |
| 56 | case HandleType::Event: | 56 | case HandleType::Event: |
| 57 | case HandleType::Process: { | 57 | case HandleType::Process: |
| 58 | case HandleType::ReadableEvent: | ||
| 59 | case HandleType::WritableEvent: { | ||
| 58 | Handle handle{}; | 60 | Handle handle{}; |
| 59 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); | 61 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); |
| 60 | return MakeResult<Handle>(handle); | 62 | return MakeResult<Handle>(handle); |
diff --git a/src/core/hle/kernel/k_event.cpp b/src/core/hle/kernel/k_event.cpp index 4020e5325..fdec0c36f 100644 --- a/src/core/hle/kernel/k_event.cpp +++ b/src/core/hle/kernel/k_event.cpp | |||
| @@ -3,14 +3,13 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "core/hle/kernel/k_event.h" | 5 | #include "core/hle/kernel/k_event.h" |
| 6 | #include "core/hle/kernel/k_readable_event.h" | ||
| 7 | #include "core/hle/kernel/k_resource_limit.h" | 6 | #include "core/hle/kernel/k_resource_limit.h" |
| 8 | #include "core/hle/kernel/k_writable_event.h" | ||
| 9 | #include "core/hle/kernel/process.h" | 7 | #include "core/hle/kernel/process.h" |
| 10 | 8 | ||
| 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(); |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index c1982e996..937020a6e 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -320,7 +320,7 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv | |||
| 320 | Kernel::KAutoObject::Create(std::addressof(accumulated_suspended_tick_changed_event)); | 320 | Kernel::KAutoObject::Create(std::addressof(accumulated_suspended_tick_changed_event)); |
| 321 | accumulated_suspended_tick_changed_event.Initialize( | 321 | accumulated_suspended_tick_changed_event.Initialize( |
| 322 | "ISelfController:AccumulatedSuspendedTickChangedEvent"); | 322 | "ISelfController:AccumulatedSuspendedTickChangedEvent"); |
| 323 | accumulated_suspended_tick_changed_event.GetWritableEvent()->Signal(); | 323 | accumulated_suspended_tick_changed_event.GetWritableEvent().Signal(); |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | ISelfController::~ISelfController() = default; | 326 | ISelfController::~ISelfController() = default; |
| @@ -379,7 +379,7 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) { | |||
| 379 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | 379 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { |
| 380 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 380 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| 381 | 381 | ||
| 382 | launchable_event.GetWritableEvent()->Signal(); | 382 | launchable_event.GetWritableEvent().Signal(); |
| 383 | 383 | ||
| 384 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 384 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 385 | rb.Push(RESULT_SUCCESS); | 385 | rb.Push(RESULT_SUCCESS); |
| @@ -592,28 +592,28 @@ AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) | |||
| 592 | 592 | ||
| 593 | AppletMessageQueue::~AppletMessageQueue() = default; | 593 | AppletMessageQueue::~AppletMessageQueue() = default; |
| 594 | 594 | ||
| 595 | Kernel::KReadableEvent* AppletMessageQueue::GetMessageReceiveEvent() const { | 595 | Kernel::KReadableEvent& AppletMessageQueue::GetMessageReceiveEvent() { |
| 596 | return on_new_message.GetReadableEvent().get(); | 596 | return on_new_message.GetReadableEvent(); |
| 597 | } | 597 | } |
| 598 | 598 | ||
| 599 | Kernel::KReadableEvent* AppletMessageQueue::GetOperationModeChangedEvent() const { | 599 | Kernel::KReadableEvent& AppletMessageQueue::GetOperationModeChangedEvent() { |
| 600 | return on_operation_mode_changed.GetReadableEvent().get(); | 600 | return on_operation_mode_changed.GetReadableEvent(); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | void AppletMessageQueue::PushMessage(AppletMessage msg) { | 603 | void AppletMessageQueue::PushMessage(AppletMessage msg) { |
| 604 | messages.push(msg); | 604 | messages.push(msg); |
| 605 | on_new_message.GetWritableEvent()->Signal(); | 605 | on_new_message.GetWritableEvent().Signal(); |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | 608 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { |
| 609 | if (messages.empty()) { | 609 | if (messages.empty()) { |
| 610 | on_new_message.GetWritableEvent()->Clear(); | 610 | on_new_message.GetWritableEvent().Clear(); |
| 611 | return AppletMessage::NoMessage; | 611 | return AppletMessage::NoMessage; |
| 612 | } | 612 | } |
| 613 | auto msg = messages.front(); | 613 | auto msg = messages.front(); |
| 614 | messages.pop(); | 614 | messages.pop(); |
| 615 | if (messages.empty()) { | 615 | if (messages.empty()) { |
| 616 | on_new_message.GetWritableEvent()->Clear(); | 616 | on_new_message.GetWritableEvent().Clear(); |
| 617 | } | 617 | } |
| 618 | return msg; | 618 | return msg; |
| 619 | } | 619 | } |
| @@ -633,7 +633,7 @@ void AppletMessageQueue::FocusStateChanged() { | |||
| 633 | void AppletMessageQueue::OperationModeChanged() { | 633 | void AppletMessageQueue::OperationModeChanged() { |
| 634 | PushMessage(AppletMessage::OperationModeChanged); | 634 | PushMessage(AppletMessage::OperationModeChanged); |
| 635 | PushMessage(AppletMessage::PerformanceModeChanged); | 635 | PushMessage(AppletMessage::PerformanceModeChanged); |
| 636 | on_operation_mode_changed.GetWritableEvent()->Signal(); | 636 | on_operation_mode_changed.GetWritableEvent().Signal(); |
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | ICommonStateGetter::ICommonStateGetter(Core::System& system_, | 639 | ICommonStateGetter::ICommonStateGetter(Core::System& system_, |
| @@ -930,11 +930,9 @@ private: | |||
| 930 | void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { | 930 | void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { |
| 931 | LOG_DEBUG(Service_AM, "called"); | 931 | LOG_DEBUG(Service_AM, "called"); |
| 932 | 932 | ||
| 933 | const auto event = applet->GetBroker().GetStateChangedEvent(); | ||
| 934 | |||
| 935 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 933 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 936 | rb.Push(RESULT_SUCCESS); | 934 | rb.Push(RESULT_SUCCESS); |
| 937 | rb.PushCopyObjects(event); | 935 | rb.PushCopyObjects(applet->GetBroker().GetStateChangedEvent()); |
| 938 | } | 936 | } |
| 939 | 937 | ||
| 940 | void IsCompleted(Kernel::HLERequestContext& ctx) { | 938 | void IsCompleted(Kernel::HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 8f6017c4e..fbac7b2cf 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -56,8 +56,8 @@ public: | |||
| 56 | explicit AppletMessageQueue(Kernel::KernelCore& kernel); | 56 | explicit AppletMessageQueue(Kernel::KernelCore& kernel); |
| 57 | ~AppletMessageQueue(); | 57 | ~AppletMessageQueue(); |
| 58 | 58 | ||
| 59 | Kernel::KReadableEvent* GetMessageReceiveEvent() const; | 59 | Kernel::KReadableEvent& GetMessageReceiveEvent(); |
| 60 | Kernel::KReadableEvent* GetOperationModeChangedEvent() const; | 60 | Kernel::KReadableEvent& GetOperationModeChangedEvent(); |
| 61 | void PushMessage(AppletMessage msg); | 61 | void PushMessage(AppletMessage msg); |
| 62 | AppletMessage PopMessage(); | 62 | AppletMessage PopMessage(); |
| 63 | std::size_t GetMessageCount() const; | 63 | std::size_t GetMessageCount() const; |
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index 6cceff064..cf8ad7598 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp | |||
| @@ -66,7 +66,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() { | |||
| 66 | 66 | ||
| 67 | auto out = std::move(out_channel.front()); | 67 | auto out = std::move(out_channel.front()); |
| 68 | out_channel.pop_front(); | 68 | out_channel.pop_front(); |
| 69 | pop_out_data_event.GetWritableEvent()->Clear(); | 69 | pop_out_data_event.GetWritableEvent().Clear(); |
| 70 | return out; | 70 | return out; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| @@ -85,7 +85,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() { | |||
| 85 | 85 | ||
| 86 | auto out = std::move(out_interactive_channel.front()); | 86 | auto out = std::move(out_interactive_channel.front()); |
| 87 | out_interactive_channel.pop_front(); | 87 | out_interactive_channel.pop_front(); |
| 88 | pop_interactive_out_data_event.GetWritableEvent()->Clear(); | 88 | pop_interactive_out_data_event.GetWritableEvent().Clear(); |
| 89 | return out; | 89 | return out; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| @@ -104,7 +104,7 @@ void AppletDataBroker::PushNormalDataFromGame(std::shared_ptr<IStorage>&& storag | |||
| 104 | 104 | ||
| 105 | void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { | 105 | void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { |
| 106 | out_channel.emplace_back(std::move(storage)); | 106 | out_channel.emplace_back(std::move(storage)); |
| 107 | pop_out_data_event.GetWritableEvent()->Signal(); | 107 | pop_out_data_event.GetWritableEvent().Signal(); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { | 110 | void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { |
| @@ -113,11 +113,11 @@ void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& s | |||
| 113 | 113 | ||
| 114 | void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { | 114 | void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { |
| 115 | out_interactive_channel.emplace_back(std::move(storage)); | 115 | out_interactive_channel.emplace_back(std::move(storage)); |
| 116 | pop_interactive_out_data_event.GetWritableEvent()->Signal(); | 116 | pop_interactive_out_data_event.GetWritableEvent().Signal(); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | void AppletDataBroker::SignalStateChanged() { | 119 | void AppletDataBroker::SignalStateChanged() { |
| 120 | state_changed_event.GetWritableEvent()->Signal(); | 120 | state_changed_event.GetWritableEvent().Signal(); |
| 121 | 121 | ||
| 122 | switch (applet_mode) { | 122 | switch (applet_mode) { |
| 123 | case LibraryAppletMode::AllForeground: | 123 | case LibraryAppletMode::AllForeground: |
| @@ -141,16 +141,16 @@ void AppletDataBroker::SignalStateChanged() { | |||
| 141 | } | 141 | } |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | Kernel::KReadableEvent* AppletDataBroker::GetNormalDataEvent() const { | 144 | Kernel::KReadableEvent& AppletDataBroker::GetNormalDataEvent() { |
| 145 | return pop_out_data_event.GetReadableEvent().get(); | 145 | return pop_out_data_event.GetReadableEvent(); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | Kernel::KReadableEvent* AppletDataBroker::GetInteractiveDataEvent() const { | 148 | Kernel::KReadableEvent& AppletDataBroker::GetInteractiveDataEvent() { |
| 149 | return pop_interactive_out_data_event.GetReadableEvent().get(); | 149 | return pop_interactive_out_data_event.GetReadableEvent(); |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | Kernel::KReadableEvent* AppletDataBroker::GetStateChangedEvent() const { | 152 | Kernel::KReadableEvent& AppletDataBroker::GetStateChangedEvent() { |
| 153 | return state_changed_event.GetReadableEvent().get(); | 153 | return state_changed_event.GetReadableEvent(); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | Applet::Applet(Core::System& system_, LibraryAppletMode applet_mode_) | 156 | Applet::Applet(Core::System& system_, LibraryAppletMode applet_mode_) |
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index 327843a98..229dc7a1e 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -96,11 +96,11 @@ public: | |||
| 96 | void PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage); | 96 | void PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage); |
| 97 | void PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage); | 97 | void PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage); |
| 98 | 98 | ||
| 99 | void SignalStateChanged() const; | 99 | void SignalStateChanged(); |
| 100 | 100 | ||
| 101 | Kernel::KReadableEvent* GetNormalDataEvent() const; | 101 | Kernel::KReadableEvent& GetNormalDataEvent(); |
| 102 | Kernel::KReadableEvent* GetInteractiveDataEvent() const; | 102 | Kernel::KReadableEvent& GetInteractiveDataEvent(); |
| 103 | Kernel::KReadableEvent* GetStateChangedEvent() const; | 103 | Kernel::KReadableEvent& GetStateChangedEvent(); |
| 104 | 104 | ||
| 105 | private: | 105 | private: |
| 106 | Core::System& system; | 106 | Core::System& system; |
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index 5a7d73b48..e1ae726f5 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp | |||
| @@ -73,7 +73,7 @@ public: | |||
| 73 | stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, | 73 | stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, |
| 74 | audio_params.channel_count, std::move(unique_name), [this] { | 74 | audio_params.channel_count, std::move(unique_name), [this] { |
| 75 | const auto guard = LockService(); | 75 | const auto guard = LockService(); |
| 76 | buffer_event.GetWritableEvent()->Signal(); | 76 | buffer_event.GetWritableEvent().Signal(); |
| 77 | }); | 77 | }); |
| 78 | } | 78 | } |
| 79 | 79 | ||
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index b0a362f52..513bd3730 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -55,7 +55,7 @@ public: | |||
| 55 | system.CoreTiming(), system.Memory(), audren_params, | 55 | system.CoreTiming(), system.Memory(), audren_params, |
| 56 | [this]() { | 56 | [this]() { |
| 57 | const auto guard = LockService(); | 57 | const auto guard = LockService(); |
| 58 | system_event.GetWritableEvent()->Signal(); | 58 | system_event.GetWritableEvent().Signal(); |
| 59 | }, | 59 | }, |
| 60 | instance_number); | 60 | instance_number); |
| 61 | } | 61 | } |
| @@ -289,7 +289,7 @@ private: | |||
| 289 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { | 289 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { |
| 290 | LOG_WARNING(Service_Audio, "(STUBBED) called"); | 290 | LOG_WARNING(Service_Audio, "(STUBBED) called"); |
| 291 | 291 | ||
| 292 | buffer_event.GetWritableEvent()->Signal(); | 292 | buffer_event.GetWritableEvent().Signal(); |
| 293 | 293 | ||
| 294 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 294 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 295 | rb.Push(RESULT_SUCCESS); | 295 | rb.Push(RESULT_SUCCESS); |
diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp index 8def52b31..0e935bfa6 100644 --- a/src/core/hle/service/bcat/backend/backend.cpp +++ b/src/core/hle/service/bcat/backend/backend.cpp | |||
| @@ -19,7 +19,7 @@ ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel, | |||
| 19 | update_event.Initialize("ProgressServiceBackend:UpdateEvent:" + std::string(event_name)); | 19 | update_event.Initialize("ProgressServiceBackend:UpdateEvent:" + std::string(event_name)); |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { | 22 | Kernel::KReadableEvent& ProgressServiceBackend::GetEvent() { |
| 23 | return update_event.GetReadableEvent(); | 23 | return update_event.GetReadableEvent(); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| @@ -85,12 +85,12 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) { | |||
| 85 | SignalUpdate(); | 85 | SignalUpdate(); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | void ProgressServiceBackend::SignalUpdate() const { | 88 | void ProgressServiceBackend::SignalUpdate() { |
| 89 | if (need_hle_lock) { | 89 | if (need_hle_lock) { |
| 90 | std::lock_guard lock(HLE::g_hle_lock); | 90 | std::lock_guard lock(HLE::g_hle_lock); |
| 91 | update_event.GetWritableEvent()->Signal(); | 91 | update_event.GetWritableEvent().Signal(); |
| 92 | } else { | 92 | } else { |
| 93 | update_event.GetWritableEvent()->Signal(); | 93 | update_event.GetWritableEvent().Signal(); |
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h index baa4d576a..f591a362a 100644 --- a/src/core/hle/service/bcat/backend/backend.h +++ b/src/core/hle/service/bcat/backend/backend.h | |||
| @@ -99,10 +99,10 @@ public: | |||
| 99 | private: | 99 | private: |
| 100 | explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name); | 100 | explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name); |
| 101 | 101 | ||
| 102 | std::shared_ptr<Kernel::KReadableEvent> GetEvent() const; | 102 | Kernel::KReadableEvent& GetEvent(); |
| 103 | DeliveryCacheProgressImpl& GetImpl(); | 103 | DeliveryCacheProgressImpl& GetImpl(); |
| 104 | 104 | ||
| 105 | void SignalUpdate() const; | 105 | void SignalUpdate(); |
| 106 | 106 | ||
| 107 | DeliveryCacheProgressImpl impl{}; | 107 | DeliveryCacheProgressImpl impl{}; |
| 108 | Kernel::KEvent update_event; | 108 | Kernel::KEvent update_event; |
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp index 8473b716b..05635a2a5 100644 --- a/src/core/hle/service/bcat/module.cpp +++ b/src/core/hle/service/bcat/module.cpp | |||
| @@ -88,11 +88,9 @@ struct DeliveryCacheDirectoryEntry { | |||
| 88 | 88 | ||
| 89 | class IDeliveryCacheProgressService final : public ServiceFramework<IDeliveryCacheProgressService> { | 89 | class IDeliveryCacheProgressService final : public ServiceFramework<IDeliveryCacheProgressService> { |
| 90 | public: | 90 | public: |
| 91 | explicit IDeliveryCacheProgressService(Core::System& system_, | 91 | explicit IDeliveryCacheProgressService(Core::System& system_, Kernel::KReadableEvent& event_, |
| 92 | std::shared_ptr<Kernel::KReadableEvent> event_, | ||
| 93 | const DeliveryCacheProgressImpl& impl_) | 92 | const DeliveryCacheProgressImpl& impl_) |
| 94 | : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{std::move(event_)}, | 93 | : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} { |
| 95 | impl{impl_} { | ||
| 96 | // clang-format off | 94 | // clang-format off |
| 97 | static const FunctionInfo functions[] = { | 95 | static const FunctionInfo functions[] = { |
| 98 | {0, &IDeliveryCacheProgressService::GetEvent, "GetEvent"}, | 96 | {0, &IDeliveryCacheProgressService::GetEvent, "GetEvent"}, |
| @@ -109,7 +107,7 @@ private: | |||
| 109 | 107 | ||
| 110 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 108 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 111 | rb.Push(RESULT_SUCCESS); | 109 | rb.Push(RESULT_SUCCESS); |
| 112 | rb.PushCopyObjects(event.get()); | 110 | rb.PushCopyObjects(event); |
| 113 | } | 111 | } |
| 114 | 112 | ||
| 115 | void GetImpl(Kernel::HLERequestContext& ctx) { | 113 | void GetImpl(Kernel::HLERequestContext& ctx) { |
| @@ -121,7 +119,7 @@ private: | |||
| 121 | rb.Push(RESULT_SUCCESS); | 119 | rb.Push(RESULT_SUCCESS); |
| 122 | } | 120 | } |
| 123 | 121 | ||
| 124 | std::shared_ptr<Kernel::KReadableEvent> event; | 122 | Kernel::KReadableEvent& event; |
| 125 | const DeliveryCacheProgressImpl& impl; | 123 | const DeliveryCacheProgressImpl& impl; |
| 126 | }; | 124 | }; |
| 127 | 125 | ||
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 77768ca7d..7acad3798 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -159,7 +159,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 159 | const auto controller_type = connected_controllers[controller_idx].type; | 159 | const auto controller_type = connected_controllers[controller_idx].type; |
| 160 | auto& controller = shared_memory_entries[controller_idx]; | 160 | auto& controller = shared_memory_entries[controller_idx]; |
| 161 | if (controller_type == NPadControllerType::None) { | 161 | if (controller_type == NPadControllerType::None) { |
| 162 | styleset_changed_events[controller_idx]->GetWritableEvent()->Signal(); | 162 | styleset_changed_events[controller_idx]->GetWritableEvent().Signal(); |
| 163 | return; | 163 | return; |
| 164 | } | 164 | } |
| 165 | controller.style_set.raw = 0; // Zero out | 165 | controller.style_set.raw = 0; // Zero out |
| @@ -959,13 +959,12 @@ bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_dev | |||
| 959 | return vibration_devices_mounted[npad_index][device_index]; | 959 | return vibration_devices_mounted[npad_index][device_index]; |
| 960 | } | 960 | } |
| 961 | 961 | ||
| 962 | Kernel::KReadableEvent* Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) const { | 962 | Kernel::KReadableEvent& Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) { |
| 963 | const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; | 963 | return styleset_changed_events[NPadIdToIndex(npad_id)]->GetReadableEvent(); |
| 964 | return styleset_event->GetReadableEvent(); | ||
| 965 | } | 964 | } |
| 966 | 965 | ||
| 967 | void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { | 966 | void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { |
| 968 | styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent()->Signal(); | 967 | styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent().Signal(); |
| 969 | } | 968 | } |
| 970 | 969 | ||
| 971 | void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) { | 970 | void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) { |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index b3de272b6..b0f575561 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -199,7 +199,7 @@ public: | |||
| 199 | 199 | ||
| 200 | bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const; | 200 | bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const; |
| 201 | 201 | ||
| 202 | Kernel::KReadableEvent* GetStyleSetChangedEvent(u32 npad_id) const; | 202 | Kernel::KReadableEvent& GetStyleSetChangedEvent(u32 npad_id); |
| 203 | void SignalStyleSetChangedEvent(u32 npad_id) const; | 203 | void SignalStyleSetChangedEvent(u32 npad_id) const; |
| 204 | 204 | ||
| 205 | // Adds a new controller at an index. | 205 | // Adds a new controller at an index. |
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index d1cf01390..d25b20ab5 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp | |||
| @@ -175,7 +175,7 @@ private: | |||
| 175 | switch (device_state) { | 175 | switch (device_state) { |
| 176 | case DeviceState::TagFound: | 176 | case DeviceState::TagFound: |
| 177 | case DeviceState::TagNearby: | 177 | case DeviceState::TagNearby: |
| 178 | deactivate_event.GetWritableEvent()->Signal(); | 178 | deactivate_event.GetWritableEvent().Signal(); |
| 179 | device_state = DeviceState::Initialized; | 179 | device_state = DeviceState::Initialized; |
| 180 | break; | 180 | break; |
| 181 | case DeviceState::SearchingForTag: | 181 | case DeviceState::SearchingForTag: |
| @@ -318,7 +318,7 @@ private: | |||
| 318 | const u32 npad_id{0}; // Player 1 controller | 318 | const u32 npad_id{0}; // Player 1 controller |
| 319 | State state{State::NonInitialized}; | 319 | State state{State::NonInitialized}; |
| 320 | DeviceState device_state{DeviceState::Initialized}; | 320 | DeviceState device_state{DeviceState::Initialized}; |
| 321 | const Module::Interface& nfp_interface; | 321 | Module::Interface& nfp_interface; |
| 322 | Kernel::KEvent deactivate_event; | 322 | Kernel::KEvent deactivate_event; |
| 323 | Kernel::KEvent availability_change_event; | 323 | Kernel::KEvent availability_change_event; |
| 324 | }; | 324 | }; |
| @@ -338,12 +338,12 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | |||
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); | 340 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); |
| 341 | nfc_tag_load.GetWritableEvent()->Signal(); | 341 | nfc_tag_load.GetWritableEvent().Signal(); |
| 342 | return true; | 342 | return true; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | Kernel::KReadableEvent* Module::Interface::GetNFCEvent() const { | 345 | Kernel::KReadableEvent& Module::Interface::GetNFCEvent() { |
| 346 | return nfc_tag_load.GetReadableEvent().get(); | 346 | return nfc_tag_load.GetReadableEvent(); |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { | 349 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { |
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index 4bca2192c..5e4e49bc6 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h | |||
| @@ -39,7 +39,7 @@ public: | |||
| 39 | 39 | ||
| 40 | void CreateUserInterface(Kernel::HLERequestContext& ctx); | 40 | void CreateUserInterface(Kernel::HLERequestContext& ctx); |
| 41 | bool LoadAmiibo(const std::vector<u8>& buffer); | 41 | bool LoadAmiibo(const std::vector<u8>& buffer); |
| 42 | Kernel::KReadableEvent* GetNFCEvent() const; | 42 | Kernel::KReadableEvent& GetNFCEvent(); |
| 43 | const AmiiboFile& GetAmiiboBuffer() const; | 43 | const AmiiboFile& GetAmiiboBuffer() const; |
| 44 | 44 | ||
| 45 | private: | 45 | private: |
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index 4a2262562..420a5a075 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp | |||
| @@ -323,7 +323,7 @@ private: | |||
| 323 | void StartTask(Kernel::HLERequestContext& ctx) { | 323 | void StartTask(Kernel::HLERequestContext& ctx) { |
| 324 | // No need to connect to the internet, just finish the task straight away. | 324 | // No need to connect to the internet, just finish the task straight away. |
| 325 | LOG_DEBUG(Service_NIM, "called"); | 325 | LOG_DEBUG(Service_NIM, "called"); |
| 326 | finished_event.GetWritableEvent()->Signal(); | 326 | finished_event.GetWritableEvent().Signal(); |
| 327 | IPC::ResponseBuilder rb{ctx, 2}; | 327 | IPC::ResponseBuilder rb{ctx, 2}; |
| 328 | rb.Push(RESULT_SUCCESS); | 328 | rb.Push(RESULT_SUCCESS); |
| 329 | } | 329 | } |
| @@ -345,7 +345,7 @@ private: | |||
| 345 | 345 | ||
| 346 | void Cancel(Kernel::HLERequestContext& ctx) { | 346 | void Cancel(Kernel::HLERequestContext& ctx) { |
| 347 | LOG_DEBUG(Service_NIM, "called"); | 347 | LOG_DEBUG(Service_NIM, "called"); |
| 348 | finished_event.GetWritableEvent()->Clear(); | 348 | finished_event.GetWritableEvent().Clear(); |
| 349 | IPC::ResponseBuilder rb{ctx, 2}; | 349 | IPC::ResponseBuilder rb{ctx, 2}; |
| 350 | rb.Push(RESULT_SUCCESS); | 350 | rb.Push(RESULT_SUCCESS); |
| 351 | } | 351 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index e99da24ab..775e76330 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | |||
| @@ -108,14 +108,14 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector | |||
| 108 | // This is mostly to take into account unimplemented features. As synced | 108 | // This is mostly to take into account unimplemented features. As synced |
| 109 | // gpu is always synced. | 109 | // gpu is always synced. |
| 110 | if (!gpu.IsAsync()) { | 110 | if (!gpu.IsAsync()) { |
| 111 | event.event->GetWritableEvent()->Signal(); | 111 | event.event->GetWritableEvent().Signal(); |
| 112 | return NvResult::Success; | 112 | return NvResult::Success; |
| 113 | } | 113 | } |
| 114 | auto lock = gpu.LockSync(); | 114 | auto lock = gpu.LockSync(); |
| 115 | const u32 current_syncpoint_value = event.fence.value; | 115 | const u32 current_syncpoint_value = event.fence.value; |
| 116 | const s32 diff = current_syncpoint_value - params.threshold; | 116 | const s32 diff = current_syncpoint_value - params.threshold; |
| 117 | if (diff >= 0) { | 117 | if (diff >= 0) { |
| 118 | event.event->GetWritableEvent()->Signal(); | 118 | event.event->GetWritableEvent().Signal(); |
| 119 | params.value = current_syncpoint_value; | 119 | params.value = current_syncpoint_value; |
| 120 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 120 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 121 | return NvResult::Success; | 121 | return NvResult::Success; |
| @@ -142,7 +142,7 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector | |||
| 142 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; | 142 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; |
| 143 | } | 143 | } |
| 144 | params.value |= event_id; | 144 | params.value |= event_id; |
| 145 | event.event->GetWritableEvent()->Clear(); | 145 | event.event->GetWritableEvent().Clear(); |
| 146 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); | 146 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); |
| 147 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 147 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 148 | return NvResult::Timeout; | 148 | return NvResult::Timeout; |
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp index 8e359040f..dc9b9341f 100644 --- a/src/core/hle/service/nvdrv/interface.cpp +++ b/src/core/hle/service/nvdrv/interface.cpp | |||
| @@ -187,9 +187,9 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) { | |||
| 187 | if (event_id < MaxNvEvents) { | 187 | if (event_id < MaxNvEvents) { |
| 188 | IPC::ResponseBuilder rb{ctx, 3, 1}; | 188 | IPC::ResponseBuilder rb{ctx, 3, 1}; |
| 189 | rb.Push(RESULT_SUCCESS); | 189 | rb.Push(RESULT_SUCCESS); |
| 190 | auto event = nvdrv->GetEvent(event_id); | 190 | auto& event = nvdrv->GetEvent(event_id); |
| 191 | event->Clear(); | 191 | event.Clear(); |
| 192 | rb.PushCopyObjects(event.get()); | 192 | rb.PushCopyObjects(event); |
| 193 | rb.PushEnum(NvResult::Success); | 193 | rb.PushEnum(NvResult::Success); |
| 194 | } else { | 194 | } else { |
| 195 | IPC::ResponseBuilder rb{ctx, 3}; | 195 | IPC::ResponseBuilder rb{ctx, 3}; |
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 2fbf61cd6..74796dce1 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp | |||
| @@ -176,16 +176,16 @@ void Module::SignalSyncpt(const u32 syncpoint_id, const u32 value) { | |||
| 176 | if (events_interface.assigned_syncpt[i] == syncpoint_id && | 176 | if (events_interface.assigned_syncpt[i] == syncpoint_id && |
| 177 | events_interface.assigned_value[i] == value) { | 177 | events_interface.assigned_value[i] == value) { |
| 178 | events_interface.LiberateEvent(i); | 178 | events_interface.LiberateEvent(i); |
| 179 | events_interface.events[i].event->GetWritableEvent()->Signal(); | 179 | events_interface.events[i].event->GetWritableEvent().Signal(); |
| 180 | } | 180 | } |
| 181 | } | 181 | } |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { | 184 | Kernel::KReadableEvent& Module::GetEvent(const u32 event_id) { |
| 185 | return SharedFrom(events_interface.events[event_id].event->GetReadableEvent()); | 185 | return events_interface.events[event_id].event->GetReadableEvent(); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { | 188 | Kernel::KWritableEvent& Module::GetEventWriteable(const u32 event_id) { |
| 189 | return events_interface.events[event_id].event->GetWritableEvent(); | 189 | return events_interface.events[event_id].event->GetWritableEvent(); |
| 190 | } | 190 | } |
| 191 | 191 | ||
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index ea5dbbdf9..a43ceb7ae 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h | |||
| @@ -136,9 +136,9 @@ public: | |||
| 136 | 136 | ||
| 137 | void SignalSyncpt(const u32 syncpoint_id, const u32 value); | 137 | void SignalSyncpt(const u32 syncpoint_id, const u32 value); |
| 138 | 138 | ||
| 139 | std::shared_ptr<Kernel::KReadableEvent> GetEvent(u32 event_id) const; | 139 | Kernel::KReadableEvent& GetEvent(u32 event_id); |
| 140 | 140 | ||
| 141 | std::shared_ptr<Kernel::KWritableEvent> GetEventWriteable(u32 event_id) const; | 141 | Kernel::KWritableEvent& GetEventWriteable(u32 event_id); |
| 142 | 142 | ||
| 143 | private: | 143 | private: |
| 144 | /// Manages syncpoints on the host | 144 | /// Manages syncpoints on the host |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 95e5a5e7f..0b6e7430b 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -41,7 +41,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | |||
| 41 | .multi_fence = {}, | 41 | .multi_fence = {}, |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | buffer_wait_event.GetWritableEvent()->Signal(); | 44 | buffer_wait_event.GetWritableEvent().Signal(); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, | 47 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, |
| @@ -119,7 +119,7 @@ void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& mult | |||
| 119 | } | 119 | } |
| 120 | free_buffers_condition.notify_one(); | 120 | free_buffers_condition.notify_one(); |
| 121 | 121 | ||
| 122 | buffer_wait_event.GetWritableEvent()->Signal(); | 122 | buffer_wait_event.GetWritableEvent().Signal(); |
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { | 125 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { |
| @@ -154,7 +154,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | |||
| 154 | } | 154 | } |
| 155 | free_buffers_condition.notify_one(); | 155 | free_buffers_condition.notify_one(); |
| 156 | 156 | ||
| 157 | buffer_wait_event.GetWritableEvent()->Signal(); | 157 | buffer_wait_event.GetWritableEvent().Signal(); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | void BufferQueue::Connect() { | 160 | void BufferQueue::Connect() { |
| @@ -169,7 +169,7 @@ void BufferQueue::Disconnect() { | |||
| 169 | std::unique_lock lock{queue_sequence_mutex}; | 169 | std::unique_lock lock{queue_sequence_mutex}; |
| 170 | queue_sequence.clear(); | 170 | queue_sequence.clear(); |
| 171 | } | 171 | } |
| 172 | buffer_wait_event.GetWritableEvent()->Signal(); | 172 | buffer_wait_event.GetWritableEvent().Signal(); |
| 173 | is_connect = false; | 173 | is_connect = false; |
| 174 | free_buffers_condition.notify_one(); | 174 | free_buffers_condition.notify_one(); |
| 175 | } | 175 | } |
| @@ -188,11 +188,11 @@ u32 BufferQueue::Query(QueryType type) { | |||
| 188 | return 0; | 188 | return 0; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { | 191 | Kernel::KWritableEvent& BufferQueue::GetWritableBufferWaitEvent() { |
| 192 | return buffer_wait_event.GetWritableEvent(); | 192 | return buffer_wait_event.GetWritableEvent(); |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { | 195 | Kernel::KReadableEvent& BufferQueue::GetBufferWaitEvent() { |
| 196 | return buffer_wait_event.GetReadableEvent(); | 196 | return buffer_wait_event.GetReadableEvent(); |
| 197 | } | 197 | } |
| 198 | 198 | ||
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index 0d2010ad5..044e51d08 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -117,9 +117,9 @@ public: | |||
| 117 | return is_connect; | 117 | return is_connect; |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | std::shared_ptr<Kernel::KWritableEvent> GetWritableBufferWaitEvent() const; | 120 | Kernel::KWritableEvent& GetWritableBufferWaitEvent(); |
| 121 | 121 | ||
| 122 | std::shared_ptr<Kernel::KReadableEvent> GetBufferWaitEvent() const; | 122 | Kernel::KReadableEvent& GetBufferWaitEvent(); |
| 123 | 123 | ||
| 124 | private: | 124 | private: |
| 125 | BufferQueue(const BufferQueue&) = delete; | 125 | BufferQueue(const BufferQueue&) = delete; |
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index c90e4d083..7fb9133c7 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -165,15 +165,15 @@ std::optional<u32> NVFlinger::FindBufferQueueId(u64 display_id, u64 layer_id) co | |||
| 165 | return layer->GetBufferQueue().GetId(); | 165 | return layer->GetBufferQueue().GetId(); |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | std::shared_ptr<Kernel::KReadableEvent> NVFlinger::FindVsyncEvent(u64 display_id) { | 168 | Kernel::KReadableEvent* NVFlinger::FindVsyncEvent(u64 display_id) { |
| 169 | const auto lock_guard = Lock(); | 169 | const auto lock_guard = Lock(); |
| 170 | auto* const display = FindDisplay(display_id); | 170 | auto* const display = FindDisplay(display_id); |
| 171 | 171 | ||
| 172 | if (display == nullptr) { | 172 | if (display == nullptr) { |
| 173 | return nullptr; | 173 | return nullptr; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | return display->GetVSyncEvent(); | 176 | return &display->GetVSyncEvent(); |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | BufferQueue* NVFlinger::FindBufferQueue(u32 id) { | 179 | BufferQueue* NVFlinger::FindBufferQueue(u32 id) { |
diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index d51b905c1..1c0aa8ec4 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h | |||
| @@ -73,7 +73,7 @@ public: | |||
| 73 | /// Gets the vsync event for the specified display. | 73 | /// Gets the vsync event for the specified display. |
| 74 | /// | 74 | /// |
| 75 | /// If an invalid display ID is provided, then nullptr is returned. | 75 | /// If an invalid display ID is provided, then nullptr is returned. |
| 76 | [[nodiscard]] std::shared_ptr<Kernel::KReadableEvent> FindVsyncEvent(u64 display_id); | 76 | [[nodiscard]] Kernel::KReadableEvent* FindVsyncEvent(u64 display_id); |
| 77 | 77 | ||
| 78 | /// Obtains a buffer queue identified by the ID. | 78 | /// Obtains a buffer queue identified by the ID. |
| 79 | [[nodiscard]] BufferQueue* FindBufferQueue(u32 id); | 79 | [[nodiscard]] BufferQueue* FindBufferQueue(u32 id); |
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index 2659ab7d5..bb7af9217 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp | |||
| @@ -41,19 +41,19 @@ public: | |||
| 41 | 41 | ||
| 42 | void SignalChargerTypeChanged() { | 42 | void SignalChargerTypeChanged() { |
| 43 | if (should_signal && should_signal_charger_type) { | 43 | if (should_signal && should_signal_charger_type) { |
| 44 | state_change_event.GetWritableEvent()->Signal(); | 44 | state_change_event.GetWritableEvent().Signal(); |
| 45 | } | 45 | } |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | void SignalPowerSupplyChanged() { | 48 | void SignalPowerSupplyChanged() { |
| 49 | if (should_signal && should_signal_power_supply) { | 49 | if (should_signal && should_signal_power_supply) { |
| 50 | state_change_event.GetWritableEvent()->Signal(); | 50 | state_change_event.GetWritableEvent().Signal(); |
| 51 | } | 51 | } |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | void SignalBatteryVoltageStateChanged() { | 54 | void SignalBatteryVoltageStateChanged() { |
| 55 | if (should_signal && should_signal_battery_voltage) { | 55 | if (should_signal && should_signal_battery_voltage) { |
| 56 | state_change_event.GetWritableEvent()->Signal(); | 56 | state_change_event.GetWritableEvent().Signal(); |
| 57 | } | 57 | } |
| 58 | } | 58 | } |
| 59 | 59 | ||
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp index 7c52b6aa7..becbd36c1 100644 --- a/src/core/hle/service/vi/display/vi_display.cpp +++ b/src/core/hle/service/vi/display/vi_display.cpp | |||
| @@ -33,12 +33,12 @@ const Layer& Display::GetLayer(std::size_t index) const { | |||
| 33 | return *layers.at(index); | 33 | return *layers.at(index); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { | 36 | Kernel::KReadableEvent& Display::GetVSyncEvent() { |
| 37 | return vsync_event.GetReadableEvent(); | 37 | return vsync_event.GetReadableEvent(); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | void Display::SignalVSyncEvent() { | 40 | void Display::SignalVSyncEvent() { |
| 41 | vsync_event.GetWritableEvent()->Signal(); | 41 | vsync_event.GetWritableEvent().Signal(); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | void Display::CreateLayer(u64 layer_id, NVFlinger::BufferQueue& buffer_queue) { | 44 | void Display::CreateLayer(u64 layer_id, NVFlinger::BufferQueue& buffer_queue) { |
diff --git a/src/core/hle/service/vi/display/vi_display.h b/src/core/hle/service/vi/display/vi_display.h index e990d6809..a09d982bc 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h | |||
| @@ -59,7 +59,7 @@ public: | |||
| 59 | const Layer& GetLayer(std::size_t index) const; | 59 | const Layer& GetLayer(std::size_t index) const; |
| 60 | 60 | ||
| 61 | /// Gets the readable vsync event. | 61 | /// Gets the readable vsync event. |
| 62 | std::shared_ptr<Kernel::KReadableEvent> GetVSyncEvent() const; | 62 | Kernel::KReadableEvent& GetVSyncEvent(); |
| 63 | 63 | ||
| 64 | /// Signals the internal vsync event. | 64 | /// Signals the internal vsync event. |
| 65 | void SignalVSyncEvent(); | 65 | void SignalVSyncEvent(); |
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 6e507bfb8..32e47a43e 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -669,12 +669,10 @@ private: | |||
| 669 | 669 | ||
| 670 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); | 670 | LOG_WARNING(Service_VI, "(STUBBED) called id={}, unknown={:08X}", id, unknown); |
| 671 | 671 | ||
| 672 | const auto& buffer_queue = *nv_flinger.FindBufferQueue(id); | ||
| 673 | |||
| 674 | // TODO(Subv): Find out what this actually is. | 672 | // TODO(Subv): Find out what this actually is. |
| 675 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 673 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 676 | rb.Push(RESULT_SUCCESS); | 674 | rb.Push(RESULT_SUCCESS); |
| 677 | rb.PushCopyObjects(buffer_queue.GetBufferWaitEvent().get()); | 675 | rb.PushCopyObjects(nv_flinger.FindBufferQueue(id)->GetBufferWaitEvent()); |
| 678 | } | 676 | } |
| 679 | 677 | ||
| 680 | NVFlinger::NVFlinger& nv_flinger; | 678 | NVFlinger::NVFlinger& nv_flinger; |
| @@ -1209,7 +1207,7 @@ private: | |||
| 1209 | 1207 | ||
| 1210 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 1208 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 1211 | rb.Push(RESULT_SUCCESS); | 1209 | rb.Push(RESULT_SUCCESS); |
| 1212 | rb.PushCopyObjects(vsync_event.get()); | 1210 | rb.PushCopyObjects(vsync_event); |
| 1213 | } | 1211 | } |
| 1214 | 1212 | ||
| 1215 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { | 1213 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { |