diff options
| author | 2021-01-31 01:38:57 -0800 | |
|---|---|---|
| committer | 2021-02-05 14:03:32 -0800 | |
| commit | ff3c7c068b926399513bf7328c22e224ab0b53d6 (patch) | |
| tree | c2a5d9f80ecf551659daa410cc384b1792eff31d /src | |
| parent | hle: kernel: Implement KEvent. (diff) | |
| download | yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.gz yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.tar.xz yuzu-ff3c7c068b926399513bf7328c22e224ab0b53d6.zip | |
hle: kernel: Reimplement KReadableEvent and KWritableEvent.
Diffstat (limited to 'src')
38 files changed, 341 insertions, 298 deletions
diff --git a/src/core/hle/kernel/k_readable_event.cpp b/src/core/hle/kernel/k_readable_event.cpp index e9e191bc6..0fa895c56 100644 --- a/src/core/hle/kernel/k_readable_event.cpp +++ b/src/core/hle/kernel/k_readable_event.cpp | |||
| @@ -1,9 +1,10 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | 1 | // Copyright 2021 yuzu emulator team |
| 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> | 5 | #include <algorithm> |
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "common/common_funcs.h" | ||
| 7 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 8 | #include "core/hle/kernel/errors.h" | 9 | #include "core/hle/kernel/errors.h" |
| 9 | #include "core/hle/kernel/k_readable_event.h" | 10 | #include "core/hle/kernel/k_readable_event.h" |
| @@ -11,40 +12,43 @@ | |||
| 11 | #include "core/hle/kernel/k_thread.h" | 12 | #include "core/hle/kernel/k_thread.h" |
| 12 | #include "core/hle/kernel/kernel.h" | 13 | #include "core/hle/kernel/kernel.h" |
| 13 | #include "core/hle/kernel/object.h" | 14 | #include "core/hle/kernel/object.h" |
| 15 | #include "core/hle/kernel/svc_results.h" | ||
| 14 | 16 | ||
| 15 | namespace Kernel { | 17 | namespace Kernel { |
| 16 | 18 | ||
| 17 | KReadableEvent::KReadableEvent(KernelCore& kernel) : KSynchronizationObject{kernel} {} | 19 | KReadableEvent::KReadableEvent(KernelCore& kernel, std::string&& name) |
| 20 | : KSynchronizationObject{kernel, std::move(name)} {} | ||
| 18 | KReadableEvent::~KReadableEvent() = default; | 21 | KReadableEvent::~KReadableEvent() = default; |
| 19 | 22 | ||
| 20 | void KReadableEvent::Signal() { | ||
| 21 | if (is_signaled) { | ||
| 22 | return; | ||
| 23 | } | ||
| 24 | |||
| 25 | is_signaled = true; | ||
| 26 | NotifyAvailable(); | ||
| 27 | } | ||
| 28 | |||
| 29 | bool KReadableEvent::IsSignaled() const { | 23 | bool KReadableEvent::IsSignaled() const { |
| 30 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); | 24 | ASSERT(kernel.GlobalSchedulerContext().IsLocked()); |
| 31 | 25 | ||
| 32 | return is_signaled; | 26 | return is_signaled; |
| 33 | } | 27 | } |
| 34 | 28 | ||
| 35 | void KReadableEvent::Clear() { | 29 | ResultCode KReadableEvent::Signal() { |
| 36 | is_signaled = false; | 30 | KScopedSchedulerLock lk{kernel}; |
| 37 | } | ||
| 38 | 31 | ||
| 39 | ResultCode KReadableEvent::Reset() { | ||
| 40 | KScopedSchedulerLock lock(kernel); | ||
| 41 | if (!is_signaled) { | 32 | if (!is_signaled) { |
| 42 | LOG_TRACE(Kernel, "Handle is not signaled! object_id={}, object_type={}, object_name={}", | 33 | is_signaled = true; |
| 43 | GetObjectId(), GetTypeName(), GetName()); | 34 | NotifyAvailable(); |
| 44 | return ERR_INVALID_STATE; | ||
| 45 | } | 35 | } |
| 46 | 36 | ||
| 47 | Clear(); | 37 | return RESULT_SUCCESS; |
| 38 | } | ||
| 39 | |||
| 40 | ResultCode KReadableEvent::Clear() { | ||
| 41 | Reset(); | ||
| 42 | |||
| 43 | return RESULT_SUCCESS; | ||
| 44 | } | ||
| 45 | |||
| 46 | ResultCode KReadableEvent::Reset() { | ||
| 47 | KScopedSchedulerLock lk{kernel}; | ||
| 48 | |||
| 49 | R_UNLESS_NOLOG(is_signaled, Svc::ResultInvalidState); | ||
| 50 | |||
| 51 | is_signaled = false; | ||
| 48 | 52 | ||
| 49 | return RESULT_SUCCESS; | 53 | return RESULT_SUCCESS; |
| 50 | } | 54 | } |
diff --git a/src/core/hle/kernel/k_readable_event.h b/src/core/hle/kernel/k_readable_event.h index 39eedc411..e6f0fd900 100644 --- a/src/core/hle/kernel/k_readable_event.h +++ b/src/core/hle/kernel/k_readable_event.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | 1 | // Copyright 2021 yuzu emulator team |
| 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 | ||
| @@ -6,25 +6,20 @@ | |||
| 6 | 6 | ||
| 7 | #include "core/hle/kernel/k_synchronization_object.h" | 7 | #include "core/hle/kernel/k_synchronization_object.h" |
| 8 | #include "core/hle/kernel/object.h" | 8 | #include "core/hle/kernel/object.h" |
| 9 | 9 | #include "core/hle/result.h" | |
| 10 | union ResultCode; | ||
| 11 | 10 | ||
| 12 | namespace Kernel { | 11 | namespace Kernel { |
| 13 | 12 | ||
| 14 | class KernelCore; | 13 | class KernelCore; |
| 15 | class KWritableEvent; | 14 | class KEvent; |
| 16 | 15 | ||
| 17 | class KReadableEvent final : public KSynchronizationObject { | 16 | class KReadableEvent final : public KSynchronizationObject { |
| 18 | friend class KWritableEvent; | ||
| 19 | |||
| 20 | public: | 17 | public: |
| 18 | explicit KReadableEvent(KernelCore& kernel, std::string&& name); | ||
| 21 | ~KReadableEvent() override; | 19 | ~KReadableEvent() override; |
| 22 | 20 | ||
| 23 | std::string GetTypeName() const override { | 21 | std::string GetTypeName() const override { |
| 24 | return "ReadableEvent"; | 22 | return "KReadableEvent"; |
| 25 | } | ||
| 26 | std::string GetName() const override { | ||
| 27 | return name; | ||
| 28 | } | 23 | } |
| 29 | 24 | ||
| 30 | static constexpr HandleType HANDLE_TYPE = HandleType::ReadableEvent; | 25 | static constexpr HandleType HANDLE_TYPE = HandleType::ReadableEvent; |
| @@ -32,28 +27,25 @@ public: | |||
| 32 | return HANDLE_TYPE; | 27 | return HANDLE_TYPE; |
| 33 | } | 28 | } |
| 34 | 29 | ||
| 35 | /// Unconditionally clears the readable event's state. | 30 | KEvent* GetParent() const { |
| 36 | void Clear(); | 31 | return parent; |
| 37 | 32 | } | |
| 38 | /// Clears the readable event's state if and only if it | ||
| 39 | /// has already been signaled. | ||
| 40 | /// | ||
| 41 | /// @pre The event must be in a signaled state. If this event | ||
| 42 | /// is in an unsignaled state and this function is called, | ||
| 43 | /// then ERR_INVALID_STATE will be returned. | ||
| 44 | ResultCode Reset(); | ||
| 45 | 33 | ||
| 46 | void Signal(); | 34 | void Initialize(KEvent* parent_) { |
| 35 | is_signaled = false; | ||
| 36 | parent = parent_; | ||
| 37 | } | ||
| 47 | 38 | ||
| 48 | bool IsSignaled() const override; | 39 | bool IsSignaled() const override; |
| 49 | |||
| 50 | void Finalize() override {} | 40 | void Finalize() override {} |
| 51 | 41 | ||
| 52 | private: | 42 | ResultCode Signal(); |
| 53 | explicit KReadableEvent(KernelCore& kernel); | 43 | ResultCode Clear(); |
| 44 | ResultCode Reset(); | ||
| 54 | 45 | ||
| 46 | private: | ||
| 55 | bool is_signaled{}; | 47 | bool is_signaled{}; |
| 56 | std::string name; ///< Name of event (optional) | 48 | KEvent* parent{}; |
| 57 | }; | 49 | }; |
| 58 | 50 | ||
| 59 | } // namespace Kernel | 51 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_synchronization_object.cpp b/src/core/hle/kernel/k_synchronization_object.cpp index a3b34f82f..140cc46a7 100644 --- a/src/core/hle/kernel/k_synchronization_object.cpp +++ b/src/core/hle/kernel/k_synchronization_object.cpp | |||
| @@ -132,6 +132,9 @@ ResultCode KSynchronizationObject::Wait(KernelCore& kernel, s32* out_index, | |||
| 132 | 132 | ||
| 133 | KSynchronizationObject::KSynchronizationObject(KernelCore& kernel) : Object{kernel} {} | 133 | KSynchronizationObject::KSynchronizationObject(KernelCore& kernel) : Object{kernel} {} |
| 134 | 134 | ||
| 135 | KSynchronizationObject::KSynchronizationObject(KernelCore& kernel, std::string&& name) | ||
| 136 | : Object{kernel, std::move(name)} {} | ||
| 137 | |||
| 135 | KSynchronizationObject::~KSynchronizationObject() = default; | 138 | KSynchronizationObject::~KSynchronizationObject() = default; |
| 136 | 139 | ||
| 137 | void KSynchronizationObject::NotifyAvailable(ResultCode result) { | 140 | void KSynchronizationObject::NotifyAvailable(ResultCode result) { |
diff --git a/src/core/hle/kernel/k_synchronization_object.h b/src/core/hle/kernel/k_synchronization_object.h index f65c71c28..5803718fd 100644 --- a/src/core/hle/kernel/k_synchronization_object.h +++ b/src/core/hle/kernel/k_synchronization_object.h | |||
| @@ -33,6 +33,7 @@ public: | |||
| 33 | 33 | ||
| 34 | protected: | 34 | protected: |
| 35 | explicit KSynchronizationObject(KernelCore& kernel); | 35 | explicit KSynchronizationObject(KernelCore& kernel); |
| 36 | explicit KSynchronizationObject(KernelCore& kernel, std::string&& name); | ||
| 36 | virtual ~KSynchronizationObject(); | 37 | virtual ~KSynchronizationObject(); |
| 37 | 38 | ||
| 38 | void NotifyAvailable(ResultCode result); | 39 | void NotifyAvailable(ResultCode result); |
diff --git a/src/core/hle/kernel/k_writable_event.cpp b/src/core/hle/kernel/k_writable_event.cpp index d2857b4c3..25c52edb2 100644 --- a/src/core/hle/kernel/k_writable_event.cpp +++ b/src/core/hle/kernel/k_writable_event.cpp | |||
| @@ -1,41 +1,27 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | 1 | // Copyright 2021 yuzu emulator team |
| 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> | 5 | #include "core/hle/kernel/k_event.h" |
| 6 | #include "common/assert.h" | ||
| 7 | #include "core/hle/kernel/k_readable_event.h" | 6 | #include "core/hle/kernel/k_readable_event.h" |
| 8 | #include "core/hle/kernel/k_thread.h" | ||
| 9 | #include "core/hle/kernel/k_writable_event.h" | 7 | #include "core/hle/kernel/k_writable_event.h" |
| 10 | #include "core/hle/kernel/kernel.h" | ||
| 11 | #include "core/hle/kernel/object.h" | ||
| 12 | 8 | ||
| 13 | namespace Kernel { | 9 | namespace Kernel { |
| 14 | 10 | ||
| 15 | KWritableEvent::KWritableEvent(KernelCore& kernel) : Object{kernel} {} | 11 | KWritableEvent::KWritableEvent(KernelCore& kernel, std::string&& name) |
| 12 | : Object{kernel, std::move(name)} {} | ||
| 16 | KWritableEvent::~KWritableEvent() = default; | 13 | KWritableEvent::~KWritableEvent() = default; |
| 17 | 14 | ||
| 18 | EventPair KWritableEvent::CreateEventPair(KernelCore& kernel, std::string name) { | 15 | void KWritableEvent::Initialize(KEvent* parent_) { |
| 19 | std::shared_ptr<KWritableEvent> writable_event(new KWritableEvent(kernel)); | 16 | parent = parent_; |
| 20 | std::shared_ptr<KReadableEvent> readable_event(new KReadableEvent(kernel)); | ||
| 21 | |||
| 22 | writable_event->name = name + ":Writable"; | ||
| 23 | writable_event->readable = readable_event; | ||
| 24 | readable_event->name = name + ":Readable"; | ||
| 25 | |||
| 26 | return {std::move(readable_event), std::move(writable_event)}; | ||
| 27 | } | ||
| 28 | |||
| 29 | std::shared_ptr<KReadableEvent> KWritableEvent::GetReadableEvent() const { | ||
| 30 | return readable; | ||
| 31 | } | 17 | } |
| 32 | 18 | ||
| 33 | void KWritableEvent::Signal() { | 19 | ResultCode KWritableEvent::Signal() { |
| 34 | readable->Signal(); | 20 | return parent->GetReadableEvent()->Signal(); |
| 35 | } | 21 | } |
| 36 | 22 | ||
| 37 | void KWritableEvent::Clear() { | 23 | ResultCode KWritableEvent::Clear() { |
| 38 | readable->Clear(); | 24 | return parent->GetReadableEvent()->Clear(); |
| 39 | } | 25 | } |
| 40 | 26 | ||
| 41 | } // namespace Kernel | 27 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_writable_event.h b/src/core/hle/kernel/k_writable_event.h index ad5514b52..518f5448d 100644 --- a/src/core/hle/kernel/k_writable_event.h +++ b/src/core/hle/kernel/k_writable_event.h | |||
| @@ -4,37 +4,21 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <memory> | ||
| 8 | |||
| 9 | #include "core/hle/kernel/object.h" | 7 | #include "core/hle/kernel/object.h" |
| 8 | #include "core/hle/result.h" | ||
| 10 | 9 | ||
| 11 | namespace Kernel { | 10 | namespace Kernel { |
| 12 | 11 | ||
| 13 | class KernelCore; | 12 | class KernelCore; |
| 14 | class KReadableEvent; | 13 | class KEvent; |
| 15 | class KWritableEvent; | ||
| 16 | |||
| 17 | struct EventPair { | ||
| 18 | std::shared_ptr<KReadableEvent> readable; | ||
| 19 | std::shared_ptr<KWritableEvent> writable; | ||
| 20 | }; | ||
| 21 | 14 | ||
| 22 | class KWritableEvent final : public Object { | 15 | class KWritableEvent final : public Object { |
| 23 | public: | 16 | public: |
| 17 | explicit KWritableEvent(KernelCore& kernel, std::string&& name); | ||
| 24 | ~KWritableEvent() override; | 18 | ~KWritableEvent() override; |
| 25 | 19 | ||
| 26 | /** | ||
| 27 | * Creates an event | ||
| 28 | * @param kernel The kernel instance to create this event under. | ||
| 29 | * @param name Optional name of event | ||
| 30 | */ | ||
| 31 | static EventPair CreateEventPair(KernelCore& kernel, std::string name = "Unknown"); | ||
| 32 | |||
| 33 | std::string GetTypeName() const override { | 20 | std::string GetTypeName() const override { |
| 34 | return "WritableEvent"; | 21 | return "KWritableEvent"; |
| 35 | } | ||
| 36 | std::string GetName() const override { | ||
| 37 | return name; | ||
| 38 | } | 22 | } |
| 39 | 23 | ||
| 40 | static constexpr HandleType HANDLE_TYPE = HandleType::WritableEvent; | 24 | static constexpr HandleType HANDLE_TYPE = HandleType::WritableEvent; |
| @@ -42,19 +26,19 @@ public: | |||
| 42 | return HANDLE_TYPE; | 26 | return HANDLE_TYPE; |
| 43 | } | 27 | } |
| 44 | 28 | ||
| 45 | std::shared_ptr<KReadableEvent> GetReadableEvent() const; | 29 | void Initialize(KEvent* parent_); |
| 46 | |||
| 47 | void Signal(); | ||
| 48 | void Clear(); | ||
| 49 | 30 | ||
| 50 | void Finalize() override {} | 31 | void Finalize() override {} |
| 51 | 32 | ||
| 52 | private: | 33 | ResultCode Signal(); |
| 53 | explicit KWritableEvent(KernelCore& kernel); | 34 | ResultCode Clear(); |
| 54 | 35 | ||
| 55 | std::shared_ptr<KReadableEvent> readable; | 36 | KEvent* GetParent() const { |
| 37 | return parent; | ||
| 38 | } | ||
| 56 | 39 | ||
| 57 | std::string name; ///< Name of event (optional) | 40 | private: |
| 41 | KEvent* parent{}; | ||
| 58 | }; | 42 | }; |
| 59 | 43 | ||
| 60 | } // namespace Kernel | 44 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp index 2c571792b..d7f40c403 100644 --- a/src/core/hle/kernel/object.cpp +++ b/src/core/hle/kernel/object.cpp | |||
| @@ -8,7 +8,10 @@ | |||
| 8 | 8 | ||
| 9 | namespace Kernel { | 9 | namespace Kernel { |
| 10 | 10 | ||
| 11 | Object::Object(KernelCore& kernel) : kernel{kernel}, object_id{kernel.CreateNewObjectID()} {} | 11 | Object::Object(KernelCore& kernel_) |
| 12 | : kernel{kernel_}, object_id{kernel_.CreateNewObjectID()}, name{"[UNKNOWN KERNEL OBJECT]"} {} | ||
| 13 | Object::Object(KernelCore& kernel_, std::string&& name_) | ||
| 14 | : kernel{kernel_}, object_id{kernel_.CreateNewObjectID()}, name{std::move(name_)} {} | ||
| 12 | Object::~Object() = default; | 15 | Object::~Object() = default; |
| 13 | 16 | ||
| 14 | bool Object::IsWaitable() const { | 17 | bool Object::IsWaitable() const { |
| @@ -21,6 +24,7 @@ bool Object::IsWaitable() const { | |||
| 21 | return true; | 24 | return true; |
| 22 | 25 | ||
| 23 | case HandleType::Unknown: | 26 | case HandleType::Unknown: |
| 27 | case HandleType::Event: | ||
| 24 | case HandleType::WritableEvent: | 28 | case HandleType::WritableEvent: |
| 25 | case HandleType::SharedMemory: | 29 | case HandleType::SharedMemory: |
| 26 | case HandleType::TransferMemory: | 30 | case HandleType::TransferMemory: |
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index be7fcb5fb..501e58b33 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h | |||
| @@ -18,6 +18,7 @@ using Handle = u32; | |||
| 18 | 18 | ||
| 19 | enum class HandleType : u32 { | 19 | enum class HandleType : u32 { |
| 20 | Unknown, | 20 | Unknown, |
| 21 | Event, | ||
| 21 | WritableEvent, | 22 | WritableEvent, |
| 22 | ReadableEvent, | 23 | ReadableEvent, |
| 23 | SharedMemory, | 24 | SharedMemory, |
| @@ -34,7 +35,8 @@ enum class HandleType : u32 { | |||
| 34 | 35 | ||
| 35 | class Object : NonCopyable, public std::enable_shared_from_this<Object> { | 36 | class Object : NonCopyable, public std::enable_shared_from_this<Object> { |
| 36 | public: | 37 | public: |
| 37 | explicit Object(KernelCore& kernel); | 38 | explicit Object(KernelCore& kernel_); |
| 39 | explicit Object(KernelCore& kernel_, std::string&& name_); | ||
| 38 | virtual ~Object(); | 40 | virtual ~Object(); |
| 39 | 41 | ||
| 40 | /// Returns a unique identifier for the object. For debugging purposes only. | 42 | /// Returns a unique identifier for the object. For debugging purposes only. |
| @@ -46,7 +48,7 @@ public: | |||
| 46 | return "[BAD KERNEL OBJECT TYPE]"; | 48 | return "[BAD KERNEL OBJECT TYPE]"; |
| 47 | } | 49 | } |
| 48 | virtual std::string GetName() const { | 50 | virtual std::string GetName() const { |
| 49 | return "[UNKNOWN KERNEL OBJECT]"; | 51 | return name; |
| 50 | } | 52 | } |
| 51 | virtual HandleType GetHandleType() const = 0; | 53 | virtual HandleType GetHandleType() const = 0; |
| 52 | 54 | ||
| @@ -69,6 +71,7 @@ protected: | |||
| 69 | 71 | ||
| 70 | private: | 72 | private: |
| 71 | std::atomic<u32> object_id{0}; | 73 | std::atomic<u32> object_id{0}; |
| 74 | std::string name; | ||
| 72 | }; | 75 | }; |
| 73 | 76 | ||
| 74 | template <typename T> | 77 | template <typename T> |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index f94eecbb8..9d036f45d 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include "core/hle/kernel/handle_table.h" | 26 | #include "core/hle/kernel/handle_table.h" |
| 27 | #include "core/hle/kernel/k_address_arbiter.h" | 27 | #include "core/hle/kernel/k_address_arbiter.h" |
| 28 | #include "core/hle/kernel/k_condition_variable.h" | 28 | #include "core/hle/kernel/k_condition_variable.h" |
| 29 | #include "core/hle/kernel/k_event.h" | ||
| 29 | #include "core/hle/kernel/k_readable_event.h" | 30 | #include "core/hle/kernel/k_readable_event.h" |
| 30 | #include "core/hle/kernel/k_resource_limit.h" | 31 | #include "core/hle/kernel/k_resource_limit.h" |
| 31 | #include "core/hle/kernel/k_scheduler.h" | 32 | #include "core/hle/kernel/k_scheduler.h" |
| @@ -1870,18 +1871,18 @@ static ResultCode CreateEvent(Core::System& system, Handle* write_handle, Handle | |||
| 1870 | LOG_DEBUG(Kernel_SVC, "called"); | 1871 | LOG_DEBUG(Kernel_SVC, "called"); |
| 1871 | 1872 | ||
| 1872 | auto& kernel = system.Kernel(); | 1873 | auto& kernel = system.Kernel(); |
| 1873 | const auto [readable_event, writable_event] = | 1874 | const auto event = KEvent::Create(kernel, "CreateEvent"); |
| 1874 | KWritableEvent::CreateEventPair(kernel, "CreateEvent"); | 1875 | event->Initialize(); |
| 1875 | 1876 | ||
| 1876 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); | 1877 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); |
| 1877 | 1878 | ||
| 1878 | const auto write_create_result = handle_table.Create(writable_event); | 1879 | const auto write_create_result = handle_table.Create(event->GetWritableEvent()); |
| 1879 | if (write_create_result.Failed()) { | 1880 | if (write_create_result.Failed()) { |
| 1880 | return write_create_result.Code(); | 1881 | return write_create_result.Code(); |
| 1881 | } | 1882 | } |
| 1882 | *write_handle = *write_create_result; | 1883 | *write_handle = *write_create_result; |
| 1883 | 1884 | ||
| 1884 | const auto read_create_result = handle_table.Create(readable_event); | 1885 | const auto read_create_result = handle_table.Create(event->GetReadableEvent()); |
| 1885 | if (read_create_result.Failed()) { | 1886 | if (read_create_result.Failed()) { |
| 1886 | handle_table.Close(*write_create_result); | 1887 | handle_table.Close(*write_create_result); |
| 1887 | return read_create_result.Code(); | 1888 | return read_create_result.Code(); |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index e1aa208ba..bb77c2569 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include "core/file_sys/registered_cache.h" | 13 | #include "core/file_sys/registered_cache.h" |
| 14 | #include "core/file_sys/savedata_factory.h" | 14 | #include "core/file_sys/savedata_factory.h" |
| 15 | #include "core/hle/ipc_helpers.h" | 15 | #include "core/hle/ipc_helpers.h" |
| 16 | #include "core/hle/kernel/k_event.h" | ||
| 16 | #include "core/hle/kernel/k_readable_event.h" | 17 | #include "core/hle/kernel/k_readable_event.h" |
| 17 | #include "core/hle/kernel/k_writable_event.h" | 18 | #include "core/hle/kernel/k_writable_event.h" |
| 18 | #include "core/hle/kernel/kernel.h" | 19 | #include "core/hle/kernel/kernel.h" |
| @@ -303,17 +304,18 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv | |||
| 303 | RegisterHandlers(functions); | 304 | RegisterHandlers(functions); |
| 304 | 305 | ||
| 305 | auto& kernel = system.Kernel(); | 306 | auto& kernel = system.Kernel(); |
| 306 | launchable_event = | 307 | launchable_event = Kernel::KEvent::Create(kernel, "ISelfController:LaunchableEvent"); |
| 307 | Kernel::KWritableEvent::CreateEventPair(kernel, "ISelfController:LaunchableEvent"); | 308 | launchable_event->Initialize(); |
| 308 | 309 | ||
| 309 | // This event is created by AM on the first time GetAccumulatedSuspendedTickChangedEvent() is | 310 | // This event is created by AM on the first time GetAccumulatedSuspendedTickChangedEvent() is |
| 310 | // called. Yuzu can just create it unconditionally, since it doesn't need to support multiple | 311 | // called. Yuzu can just create it unconditionally, since it doesn't need to support multiple |
| 311 | // ISelfControllers. The event is signaled on creation, and on transition from suspended -> not | 312 | // ISelfControllers. The event is signaled on creation, and on transition from suspended -> not |
| 312 | // suspended if the event has previously been created by a call to | 313 | // suspended if the event has previously been created by a call to |
| 313 | // GetAccumulatedSuspendedTickChangedEvent. | 314 | // GetAccumulatedSuspendedTickChangedEvent. |
| 314 | accumulated_suspended_tick_changed_event = Kernel::KWritableEvent::CreateEventPair( | 315 | accumulated_suspended_tick_changed_event = |
| 315 | kernel, "ISelfController:AccumulatedSuspendedTickChangedEvent"); | 316 | Kernel::KEvent::Create(kernel, "ISelfController:AccumulatedSuspendedTickChangedEvent"); |
| 316 | accumulated_suspended_tick_changed_event.writable->Signal(); | 317 | accumulated_suspended_tick_changed_event->Initialize(); |
| 318 | accumulated_suspended_tick_changed_event->GetWritableEvent()->Signal(); | ||
| 317 | } | 319 | } |
| 318 | 320 | ||
| 319 | ISelfController::~ISelfController() = default; | 321 | ISelfController::~ISelfController() = default; |
| @@ -372,11 +374,11 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) { | |||
| 372 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | 374 | void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { |
| 373 | LOG_WARNING(Service_AM, "(STUBBED) called"); | 375 | LOG_WARNING(Service_AM, "(STUBBED) called"); |
| 374 | 376 | ||
| 375 | launchable_event.writable->Signal(); | 377 | launchable_event->GetWritableEvent()->Signal(); |
| 376 | 378 | ||
| 377 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 379 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 378 | rb.Push(RESULT_SUCCESS); | 380 | rb.Push(RESULT_SUCCESS); |
| 379 | rb.PushCopyObjects(launchable_event.readable); | 381 | rb.PushCopyObjects(launchable_event->GetReadableEvent()); |
| 380 | } | 382 | } |
| 381 | 383 | ||
| 382 | void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { | 384 | void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { |
| @@ -555,41 +557,42 @@ void ISelfController::GetAccumulatedSuspendedTickChangedEvent(Kernel::HLERequest | |||
| 555 | 557 | ||
| 556 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 558 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 557 | rb.Push(RESULT_SUCCESS); | 559 | rb.Push(RESULT_SUCCESS); |
| 558 | rb.PushCopyObjects(accumulated_suspended_tick_changed_event.readable); | 560 | rb.PushCopyObjects(accumulated_suspended_tick_changed_event->GetReadableEvent()); |
| 559 | } | 561 | } |
| 560 | 562 | ||
| 561 | AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) { | 563 | AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) { |
| 562 | on_new_message = | 564 | on_new_message = Kernel::KEvent::Create(kernel, "AMMessageQueue:OnMessageReceived"); |
| 563 | Kernel::KWritableEvent::CreateEventPair(kernel, "AMMessageQueue:OnMessageReceived"); | 565 | on_new_message->Initialize(); |
| 564 | on_operation_mode_changed = | 566 | on_operation_mode_changed = |
| 565 | Kernel::KWritableEvent::CreateEventPair(kernel, "AMMessageQueue:OperationModeChanged"); | 567 | Kernel::KEvent::Create(kernel, "AMMessageQueue:OperationModeChanged"); |
| 568 | on_operation_mode_changed->Initialize(); | ||
| 566 | } | 569 | } |
| 567 | 570 | ||
| 568 | AppletMessageQueue::~AppletMessageQueue() = default; | 571 | AppletMessageQueue::~AppletMessageQueue() = default; |
| 569 | 572 | ||
| 570 | const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const { | 573 | const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const { |
| 571 | return on_new_message.readable; | 574 | return on_new_message->GetReadableEvent(); |
| 572 | } | 575 | } |
| 573 | 576 | ||
| 574 | const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() | 577 | const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() |
| 575 | const { | 578 | const { |
| 576 | return on_operation_mode_changed.readable; | 579 | return on_operation_mode_changed->GetReadableEvent(); |
| 577 | } | 580 | } |
| 578 | 581 | ||
| 579 | void AppletMessageQueue::PushMessage(AppletMessage msg) { | 582 | void AppletMessageQueue::PushMessage(AppletMessage msg) { |
| 580 | messages.push(msg); | 583 | messages.push(msg); |
| 581 | on_new_message.writable->Signal(); | 584 | on_new_message->GetWritableEvent()->Signal(); |
| 582 | } | 585 | } |
| 583 | 586 | ||
| 584 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | 587 | AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { |
| 585 | if (messages.empty()) { | 588 | if (messages.empty()) { |
| 586 | on_new_message.writable->Clear(); | 589 | on_new_message->GetWritableEvent()->Clear(); |
| 587 | return AppletMessage::NoMessage; | 590 | return AppletMessage::NoMessage; |
| 588 | } | 591 | } |
| 589 | auto msg = messages.front(); | 592 | auto msg = messages.front(); |
| 590 | messages.pop(); | 593 | messages.pop(); |
| 591 | if (messages.empty()) { | 594 | if (messages.empty()) { |
| 592 | on_new_message.writable->Clear(); | 595 | on_new_message->GetWritableEvent()->Clear(); |
| 593 | } | 596 | } |
| 594 | return msg; | 597 | return msg; |
| 595 | } | 598 | } |
| @@ -601,7 +604,7 @@ std::size_t AppletMessageQueue::GetMessageCount() const { | |||
| 601 | void AppletMessageQueue::OperationModeChanged() { | 604 | void AppletMessageQueue::OperationModeChanged() { |
| 602 | PushMessage(AppletMessage::OperationModeChanged); | 605 | PushMessage(AppletMessage::OperationModeChanged); |
| 603 | PushMessage(AppletMessage::PerformanceModeChanged); | 606 | PushMessage(AppletMessage::PerformanceModeChanged); |
| 604 | on_operation_mode_changed.writable->Signal(); | 607 | on_operation_mode_changed->GetWritableEvent()->Signal(); |
| 605 | } | 608 | } |
| 606 | 609 | ||
| 607 | void AppletMessageQueue::RequestExit() { | 610 | void AppletMessageQueue::RequestExit() { |
| @@ -1229,14 +1232,15 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) | |||
| 1229 | RegisterHandlers(functions); | 1232 | RegisterHandlers(functions); |
| 1230 | 1233 | ||
| 1231 | auto& kernel = system.Kernel(); | 1234 | auto& kernel = system.Kernel(); |
| 1232 | gpu_error_detected_event = Kernel::KWritableEvent::CreateEventPair( | 1235 | gpu_error_detected_event = |
| 1233 | kernel, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); | 1236 | Kernel::KEvent::Create(kernel, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); |
| 1234 | 1237 | gpu_error_detected_event->Initialize(); | |
| 1235 | friend_invitation_storage_channel_event = Kernel::KWritableEvent::CreateEventPair( | 1238 | friend_invitation_storage_channel_event = |
| 1236 | kernel, "IApplicationFunctions:FriendInvitationStorageChannelEvent"); | 1239 | Kernel::KEvent::Create(kernel, "IApplicationFunctions:FriendInvitationStorageChannelEvent"); |
| 1237 | 1240 | friend_invitation_storage_channel_event->Initialize(); | |
| 1238 | health_warning_disappeared_system_event = Kernel::WritableEvent::CreateEventPair( | 1241 | health_warning_disappeared_system_event = |
| 1239 | kernel, "IApplicationFunctions:HealthWarningDisappearedSystemEvent"); | 1242 | Kernel::KEvent::Create(kernel, "IApplicationFunctions:HealthWarningDisappearedSystemEvent"); |
| 1243 | health_warning_disappeared_system_event->Initialize(); | ||
| 1240 | } | 1244 | } |
| 1241 | 1245 | ||
| 1242 | IApplicationFunctions::~IApplicationFunctions() = default; | 1246 | IApplicationFunctions::~IApplicationFunctions() = default; |
| @@ -1633,7 +1637,7 @@ void IApplicationFunctions::GetGpuErrorDetectedSystemEvent(Kernel::HLERequestCon | |||
| 1633 | 1637 | ||
| 1634 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 1638 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 1635 | rb.Push(RESULT_SUCCESS); | 1639 | rb.Push(RESULT_SUCCESS); |
| 1636 | rb.PushCopyObjects(gpu_error_detected_event.readable); | 1640 | rb.PushCopyObjects(gpu_error_detected_event->GetReadableEvent()); |
| 1637 | } | 1641 | } |
| 1638 | 1642 | ||
| 1639 | void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERequestContext& ctx) { | 1643 | void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERequestContext& ctx) { |
| @@ -1641,7 +1645,7 @@ void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERe | |||
| 1641 | 1645 | ||
| 1642 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 1646 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 1643 | rb.Push(RESULT_SUCCESS); | 1647 | rb.Push(RESULT_SUCCESS); |
| 1644 | rb.PushCopyObjects(friend_invitation_storage_channel_event.readable); | 1648 | rb.PushCopyObjects(friend_invitation_storage_channel_event->GetReadableEvent()); |
| 1645 | } | 1649 | } |
| 1646 | 1650 | ||
| 1647 | void IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( | 1651 | void IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( |
| @@ -1657,7 +1661,7 @@ void IApplicationFunctions::GetHealthWarningDisappearedSystemEvent(Kernel::HLERe | |||
| 1657 | 1661 | ||
| 1658 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 1662 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 1659 | rb.Push(RESULT_SUCCESS); | 1663 | rb.Push(RESULT_SUCCESS); |
| 1660 | rb.PushCopyObjects(health_warning_disappeared_system_event.readable); | 1664 | rb.PushCopyObjects(health_warning_disappeared_system_event->GetReadableEvent()); |
| 1661 | } | 1665 | } |
| 1662 | 1666 | ||
| 1663 | void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, | 1667 | void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, |
| @@ -1693,8 +1697,9 @@ IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_) | |||
| 1693 | 1697 | ||
| 1694 | RegisterHandlers(functions); | 1698 | RegisterHandlers(functions); |
| 1695 | 1699 | ||
| 1696 | pop_from_general_channel_event = Kernel::KWritableEvent::CreateEventPair( | 1700 | pop_from_general_channel_event = |
| 1697 | system.Kernel(), "IHomeMenuFunctions:PopFromGeneralChannelEvent"); | 1701 | Kernel::KEvent::Create(system.Kernel(), "IHomeMenuFunctions:PopFromGeneralChannelEvent"); |
| 1702 | pop_from_general_channel_event->Initialize(); | ||
| 1698 | } | 1703 | } |
| 1699 | 1704 | ||
| 1700 | IHomeMenuFunctions::~IHomeMenuFunctions() = default; | 1705 | IHomeMenuFunctions::~IHomeMenuFunctions() = default; |
| @@ -1711,7 +1716,7 @@ void IHomeMenuFunctions::GetPopFromGeneralChannelEvent(Kernel::HLERequestContext | |||
| 1711 | 1716 | ||
| 1712 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 1717 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 1713 | rb.Push(RESULT_SUCCESS); | 1718 | rb.Push(RESULT_SUCCESS); |
| 1714 | rb.PushCopyObjects(pop_from_general_channel_event.readable); | 1719 | rb.PushCopyObjects(pop_from_general_channel_event->GetReadableEvent()); |
| 1715 | } | 1720 | } |
| 1716 | 1721 | ||
| 1717 | IGlobalStateController::IGlobalStateController(Core::System& system_) | 1722 | IGlobalStateController::IGlobalStateController(Core::System& system_) |
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 37d7b41de..6911f0d6e 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h | |||
| @@ -7,11 +7,12 @@ | |||
| 7 | #include <chrono> | 7 | #include <chrono> |
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | #include <queue> | 9 | #include <queue> |
| 10 | #include "core/hle/kernel/k_writable_event.h" | 10 | |
| 11 | #include "core/hle/service/service.h" | 11 | #include "core/hle/service/service.h" |
| 12 | 12 | ||
| 13 | namespace Kernel { | 13 | namespace Kernel { |
| 14 | class KernelCore; | 14 | class KernelCore; |
| 15 | class KEvent; | ||
| 15 | class TransferMemory; | 16 | class TransferMemory; |
| 16 | } // namespace Kernel | 17 | } // namespace Kernel |
| 17 | 18 | ||
| @@ -65,8 +66,8 @@ public: | |||
| 65 | 66 | ||
| 66 | private: | 67 | private: |
| 67 | std::queue<AppletMessage> messages; | 68 | std::queue<AppletMessage> messages; |
| 68 | Kernel::EventPair on_new_message; | 69 | std::shared_ptr<Kernel::KEvent> on_new_message; |
| 69 | Kernel::EventPair on_operation_mode_changed; | 70 | std::shared_ptr<Kernel::KEvent> on_operation_mode_changed; |
| 70 | }; | 71 | }; |
| 71 | 72 | ||
| 72 | class IWindowController final : public ServiceFramework<IWindowController> { | 73 | class IWindowController final : public ServiceFramework<IWindowController> { |
| @@ -153,8 +154,8 @@ private: | |||
| 153 | }; | 154 | }; |
| 154 | 155 | ||
| 155 | NVFlinger::NVFlinger& nvflinger; | 156 | NVFlinger::NVFlinger& nvflinger; |
| 156 | Kernel::EventPair launchable_event; | 157 | std::shared_ptr<Kernel::KEvent> launchable_event; |
| 157 | Kernel::EventPair accumulated_suspended_tick_changed_event; | 158 | std::shared_ptr<Kernel::KEvent> accumulated_suspended_tick_changed_event; |
| 158 | 159 | ||
| 159 | u32 idle_time_detection_extension = 0; | 160 | u32 idle_time_detection_extension = 0; |
| 160 | u64 num_fatal_sections_entered = 0; | 161 | u64 num_fatal_sections_entered = 0; |
| @@ -295,9 +296,9 @@ private: | |||
| 295 | bool launch_popped_application_specific = false; | 296 | bool launch_popped_application_specific = false; |
| 296 | bool launch_popped_account_preselect = false; | 297 | bool launch_popped_account_preselect = false; |
| 297 | s32 previous_program_index{-1}; | 298 | s32 previous_program_index{-1}; |
| 298 | Kernel::EventPair gpu_error_detected_event; | 299 | std::shared_ptr<Kernel::KEvent> gpu_error_detected_event; |
| 299 | Kernel::EventPair friend_invitation_storage_channel_event; | 300 | std::shared_ptr<Kernel::KEvent> friend_invitation_storage_channel_event; |
| 300 | Kernel::EventPair health_warning_disappeared_system_event; | 301 | std::shared_ptr<Kernel::KEvent> health_warning_disappeared_system_event; |
| 301 | }; | 302 | }; |
| 302 | 303 | ||
| 303 | class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { | 304 | class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { |
| @@ -309,7 +310,7 @@ private: | |||
| 309 | void RequestToGetForeground(Kernel::HLERequestContext& ctx); | 310 | void RequestToGetForeground(Kernel::HLERequestContext& ctx); |
| 310 | void GetPopFromGeneralChannelEvent(Kernel::HLERequestContext& ctx); | 311 | void GetPopFromGeneralChannelEvent(Kernel::HLERequestContext& ctx); |
| 311 | 312 | ||
| 312 | Kernel::EventPair pop_from_general_channel_event; | 313 | std::shared_ptr<Kernel::KEvent> pop_from_general_channel_event; |
| 313 | }; | 314 | }; |
| 314 | 315 | ||
| 315 | class IGlobalStateController final : public ServiceFramework<IGlobalStateController> { | 316 | class IGlobalStateController final : public ServiceFramework<IGlobalStateController> { |
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index c96b455d3..e2f3b7563 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <cstring> | 5 | #include <cstring> |
| 6 | |||
| 6 | #include "common/assert.h" | 7 | #include "common/assert.h" |
| 7 | #include "core/core.h" | 8 | #include "core/core.h" |
| 8 | #include "core/frontend/applets/controller.h" | 9 | #include "core/frontend/applets/controller.h" |
| @@ -11,6 +12,7 @@ | |||
| 11 | #include "core/frontend/applets/profile_select.h" | 12 | #include "core/frontend/applets/profile_select.h" |
| 12 | #include "core/frontend/applets/software_keyboard.h" | 13 | #include "core/frontend/applets/software_keyboard.h" |
| 13 | #include "core/frontend/applets/web_browser.h" | 14 | #include "core/frontend/applets/web_browser.h" |
| 15 | #include "core/hle/kernel/k_event.h" | ||
| 14 | #include "core/hle/kernel/k_readable_event.h" | 16 | #include "core/hle/kernel/k_readable_event.h" |
| 15 | #include "core/hle/kernel/k_writable_event.h" | 17 | #include "core/hle/kernel/k_writable_event.h" |
| 16 | #include "core/hle/kernel/server_session.h" | 18 | #include "core/hle/kernel/server_session.h" |
| @@ -27,11 +29,13 @@ namespace Service::AM::Applets { | |||
| 27 | 29 | ||
| 28 | AppletDataBroker::AppletDataBroker(Kernel::KernelCore& kernel) { | 30 | AppletDataBroker::AppletDataBroker(Kernel::KernelCore& kernel) { |
| 29 | state_changed_event = | 31 | state_changed_event = |
| 30 | Kernel::KWritableEvent::CreateEventPair(kernel, "ILibraryAppletAccessor:StateChangedEvent"); | 32 | Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:StateChangedEvent"); |
| 31 | pop_out_data_event = | 33 | state_changed_event->Initialize(); |
| 32 | Kernel::KWritableEvent::CreateEventPair(kernel, "ILibraryAppletAccessor:PopDataOutEvent"); | 34 | pop_out_data_event = Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:PopDataOutEvent"); |
| 33 | pop_interactive_out_data_event = Kernel::KWritableEvent::CreateEventPair( | 35 | pop_out_data_event->Initialize(); |
| 34 | kernel, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | 36 | pop_interactive_out_data_event = |
| 37 | Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | ||
| 38 | pop_interactive_out_data_event->Initialize(); | ||
| 35 | } | 39 | } |
| 36 | 40 | ||
| 37 | AppletDataBroker::~AppletDataBroker() = default; | 41 | AppletDataBroker::~AppletDataBroker() = default; |
| @@ -58,7 +62,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() { | |||
| 58 | 62 | ||
| 59 | auto out = std::move(out_channel.front()); | 63 | auto out = std::move(out_channel.front()); |
| 60 | out_channel.pop_front(); | 64 | out_channel.pop_front(); |
| 61 | pop_out_data_event.writable->Clear(); | 65 | pop_out_data_event->GetWritableEvent()->Clear(); |
| 62 | return out; | 66 | return out; |
| 63 | } | 67 | } |
| 64 | 68 | ||
| @@ -77,7 +81,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() { | |||
| 77 | 81 | ||
| 78 | auto out = std::move(out_interactive_channel.front()); | 82 | auto out = std::move(out_interactive_channel.front()); |
| 79 | out_interactive_channel.pop_front(); | 83 | out_interactive_channel.pop_front(); |
| 80 | pop_interactive_out_data_event.writable->Clear(); | 84 | pop_interactive_out_data_event->GetWritableEvent()->Clear(); |
| 81 | return out; | 85 | return out; |
| 82 | } | 86 | } |
| 83 | 87 | ||
| @@ -96,7 +100,7 @@ void AppletDataBroker::PushNormalDataFromGame(std::shared_ptr<IStorage>&& storag | |||
| 96 | 100 | ||
| 97 | void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { | 101 | void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { |
| 98 | out_channel.emplace_back(std::move(storage)); | 102 | out_channel.emplace_back(std::move(storage)); |
| 99 | pop_out_data_event.writable->Signal(); | 103 | pop_out_data_event->GetWritableEvent()->Signal(); |
| 100 | } | 104 | } |
| 101 | 105 | ||
| 102 | void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { | 106 | void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { |
| @@ -105,23 +109,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& s | |||
| 105 | 109 | ||
| 106 | void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { | 110 | void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { |
| 107 | out_interactive_channel.emplace_back(std::move(storage)); | 111 | out_interactive_channel.emplace_back(std::move(storage)); |
| 108 | pop_interactive_out_data_event.writable->Signal(); | 112 | pop_interactive_out_data_event->GetWritableEvent()->Signal(); |
| 109 | } | 113 | } |
| 110 | 114 | ||
| 111 | void AppletDataBroker::SignalStateChanged() const { | 115 | void AppletDataBroker::SignalStateChanged() const { |
| 112 | state_changed_event.writable->Signal(); | 116 | state_changed_event->GetWritableEvent()->Signal(); |
| 113 | } | 117 | } |
| 114 | 118 | ||
| 115 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetNormalDataEvent() const { | 119 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetNormalDataEvent() const { |
| 116 | return pop_out_data_event.readable; | 120 | return pop_out_data_event->GetReadableEvent(); |
| 117 | } | 121 | } |
| 118 | 122 | ||
| 119 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { | 123 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { |
| 120 | return pop_interactive_out_data_event.readable; | 124 | return pop_interactive_out_data_event->GetReadableEvent(); |
| 121 | } | 125 | } |
| 122 | 126 | ||
| 123 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const { | 127 | std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const { |
| 124 | return state_changed_event.readable; | 128 | return state_changed_event->GetReadableEvent(); |
| 125 | } | 129 | } |
| 126 | 130 | ||
| 127 | Applet::Applet(Kernel::KernelCore& kernel_) : broker{kernel_} {} | 131 | Applet::Applet(Kernel::KernelCore& kernel_) : broker{kernel_} {} |
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index 7ebfb9bbd..b9a006317 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include <queue> | 8 | #include <queue> |
| 9 | |||
| 9 | #include "common/swap.h" | 10 | #include "common/swap.h" |
| 10 | #include "core/hle/kernel/k_writable_event.h" | ||
| 11 | #include "core/hle/kernel/object.h" | 11 | #include "core/hle/kernel/object.h" |
| 12 | 12 | ||
| 13 | union ResultCode; | 13 | union ResultCode; |
| @@ -29,7 +29,9 @@ class WebBrowserApplet; | |||
| 29 | 29 | ||
| 30 | namespace Kernel { | 30 | namespace Kernel { |
| 31 | class KernelCore; | 31 | class KernelCore; |
| 32 | } | 32 | class KEvent; |
| 33 | class KReadableEvent; | ||
| 34 | } // namespace Kernel | ||
| 33 | 35 | ||
| 34 | namespace Service::AM { | 36 | namespace Service::AM { |
| 35 | 37 | ||
| @@ -106,13 +108,13 @@ private: | |||
| 106 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet | 108 | // PopInteractiveDataToGame and PushInteractiveDataFromApplet |
| 107 | std::deque<std::shared_ptr<IStorage>> out_interactive_channel; | 109 | std::deque<std::shared_ptr<IStorage>> out_interactive_channel; |
| 108 | 110 | ||
| 109 | Kernel::EventPair state_changed_event; | 111 | std::shared_ptr<Kernel::KEvent> state_changed_event; |
| 110 | 112 | ||
| 111 | // Signaled on PushNormalDataFromApplet | 113 | // Signaled on PushNormalDataFromApplet |
| 112 | Kernel::EventPair pop_out_data_event; | 114 | std::shared_ptr<Kernel::KEvent> pop_out_data_event; |
| 113 | 115 | ||
| 114 | // Signaled on PushInteractiveDataFromApplet | 116 | // Signaled on PushInteractiveDataFromApplet |
| 115 | Kernel::EventPair pop_interactive_out_data_event; | 117 | std::shared_ptr<Kernel::KEvent> pop_interactive_out_data_event; |
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | class Applet { | 120 | class Applet { |
diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 334920c23..8d657c0bf 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <algorithm> | 5 | #include <algorithm> |
| 6 | #include <numeric> | 6 | #include <numeric> |
| 7 | #include <vector> | 7 | #include <vector> |
| 8 | |||
| 8 | #include "common/logging/log.h" | 9 | #include "common/logging/log.h" |
| 9 | #include "core/core.h" | 10 | #include "core/core.h" |
| 10 | #include "core/file_sys/common_funcs.h" | 11 | #include "core/file_sys/common_funcs.h" |
| @@ -14,8 +15,8 @@ | |||
| 14 | #include "core/file_sys/patch_manager.h" | 15 | #include "core/file_sys/patch_manager.h" |
| 15 | #include "core/file_sys/registered_cache.h" | 16 | #include "core/file_sys/registered_cache.h" |
| 16 | #include "core/hle/ipc_helpers.h" | 17 | #include "core/hle/ipc_helpers.h" |
| 18 | #include "core/hle/kernel/k_event.h" | ||
| 17 | #include "core/hle/kernel/k_readable_event.h" | 19 | #include "core/hle/kernel/k_readable_event.h" |
| 18 | #include "core/hle/kernel/k_writable_event.h" | ||
| 19 | #include "core/hle/kernel/kernel.h" | 20 | #include "core/hle/kernel/kernel.h" |
| 20 | #include "core/hle/kernel/process.h" | 21 | #include "core/hle/kernel/process.h" |
| 21 | #include "core/hle/service/aoc/aoc_u.h" | 22 | #include "core/hle/service/aoc/aoc_u.h" |
| @@ -62,8 +63,9 @@ public: | |||
| 62 | 63 | ||
| 63 | RegisterHandlers(functions); | 64 | RegisterHandlers(functions); |
| 64 | 65 | ||
| 65 | purchased_event = Kernel::KWritableEvent::CreateEventPair( | 66 | purchased_event = |
| 66 | system.Kernel(), "IPurchaseEventManager:PurchasedEvent"); | 67 | Kernel::KEvent::Create(system.Kernel(), "IPurchaseEventManager:PurchasedEvent"); |
| 68 | purchased_event->Initialize(); | ||
| 67 | } | 69 | } |
| 68 | 70 | ||
| 69 | private: | 71 | private: |
| @@ -96,10 +98,10 @@ private: | |||
| 96 | 98 | ||
| 97 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 99 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 98 | rb.Push(RESULT_SUCCESS); | 100 | rb.Push(RESULT_SUCCESS); |
| 99 | rb.PushCopyObjects(purchased_event.readable); | 101 | rb.PushCopyObjects(purchased_event->GetReadableEvent()); |
| 100 | } | 102 | } |
| 101 | 103 | ||
| 102 | Kernel::EventPair purchased_event; | 104 | std::shared_ptr<Kernel::KEvent> purchased_event; |
| 103 | }; | 105 | }; |
| 104 | 106 | ||
| 105 | AOC_U::AOC_U(Core::System& system_) | 107 | AOC_U::AOC_U(Core::System& system_) |
| @@ -124,8 +126,8 @@ AOC_U::AOC_U(Core::System& system_) | |||
| 124 | RegisterHandlers(functions); | 126 | RegisterHandlers(functions); |
| 125 | 127 | ||
| 126 | auto& kernel = system.Kernel(); | 128 | auto& kernel = system.Kernel(); |
| 127 | aoc_change_event = | 129 | aoc_change_event = Kernel::KEvent::Create(kernel, "GetAddOnContentListChanged:Event"); |
| 128 | Kernel::KWritableEvent::CreateEventPair(kernel, "GetAddOnContentListChanged:Event"); | 130 | aoc_change_event->Initialize(); |
| 129 | } | 131 | } |
| 130 | 132 | ||
| 131 | AOC_U::~AOC_U() = default; | 133 | AOC_U::~AOC_U() = default; |
| @@ -252,7 +254,7 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { | |||
| 252 | 254 | ||
| 253 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 255 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 254 | rb.Push(RESULT_SUCCESS); | 256 | rb.Push(RESULT_SUCCESS); |
| 255 | rb.PushCopyObjects(aoc_change_event.readable); | 257 | rb.PushCopyObjects(aoc_change_event->GetReadableEvent()); |
| 256 | } | 258 | } |
| 257 | 259 | ||
| 258 | void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { | 260 | void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h index 594152de5..1aa23529e 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h | |||
| @@ -11,7 +11,7 @@ class System; | |||
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | namespace Kernel { | 13 | namespace Kernel { |
| 14 | class KWritableEvent; | 14 | class KEvent; |
| 15 | } | 15 | } |
| 16 | 16 | ||
| 17 | namespace Service::AOC { | 17 | namespace Service::AOC { |
| @@ -31,7 +31,7 @@ private: | |||
| 31 | void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx); | 31 | void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx); |
| 32 | 32 | ||
| 33 | std::vector<u64> add_on_content; | 33 | std::vector<u64> add_on_content; |
| 34 | Kernel::EventPair aoc_change_event; | 34 | std::shared_ptr<Kernel::KEvent> aoc_change_event; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | /// Registers all AOC services with the specified service manager. | 37 | /// Registers all AOC services with the specified service manager. |
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index 3c60ec43d..5ed9cb20e 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include "core/core.h" | 14 | #include "core/core.h" |
| 15 | #include "core/hle/ipc_helpers.h" | 15 | #include "core/hle/ipc_helpers.h" |
| 16 | #include "core/hle/kernel/hle_ipc.h" | 16 | #include "core/hle/kernel/hle_ipc.h" |
| 17 | #include "core/hle/kernel/k_event.h" | ||
| 17 | #include "core/hle/kernel/k_readable_event.h" | 18 | #include "core/hle/kernel/k_readable_event.h" |
| 18 | #include "core/hle/kernel/k_writable_event.h" | 19 | #include "core/hle/kernel/k_writable_event.h" |
| 19 | #include "core/hle/kernel/kernel.h" | 20 | #include "core/hle/kernel/kernel.h" |
| @@ -66,13 +67,13 @@ public: | |||
| 66 | RegisterHandlers(functions); | 67 | RegisterHandlers(functions); |
| 67 | 68 | ||
| 68 | // This is the event handle used to check if the audio buffer was released | 69 | // This is the event handle used to check if the audio buffer was released |
| 69 | buffer_event = | 70 | buffer_event = Kernel::KEvent::Create(system.Kernel(), "IAudioOutBufferReleased"); |
| 70 | Kernel::KWritableEvent::CreateEventPair(system.Kernel(), "IAudioOutBufferReleased"); | 71 | buffer_event->Initialize(); |
| 71 | 72 | ||
| 72 | stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, | 73 | stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, |
| 73 | audio_params.channel_count, std::move(unique_name), [this] { | 74 | audio_params.channel_count, std::move(unique_name), [this] { |
| 74 | const auto guard = LockService(); | 75 | const auto guard = LockService(); |
| 75 | buffer_event.writable->Signal(); | 76 | buffer_event->GetWritableEvent()->Signal(); |
| 76 | }); | 77 | }); |
| 77 | } | 78 | } |
| 78 | 79 | ||
| @@ -125,7 +126,7 @@ private: | |||
| 125 | 126 | ||
| 126 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 127 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 127 | rb.Push(RESULT_SUCCESS); | 128 | rb.Push(RESULT_SUCCESS); |
| 128 | rb.PushCopyObjects(buffer_event.readable); | 129 | rb.PushCopyObjects(buffer_event->GetReadableEvent()); |
| 129 | } | 130 | } |
| 130 | 131 | ||
| 131 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { | 132 | void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { |
| @@ -219,7 +220,7 @@ private: | |||
| 219 | [[maybe_unused]] AudoutParams audio_params{}; | 220 | [[maybe_unused]] AudoutParams audio_params{}; |
| 220 | 221 | ||
| 221 | /// This is the event handle used to check if the audio buffer was released | 222 | /// This is the event handle used to check if the audio buffer was released |
| 222 | Kernel::EventPair buffer_event; | 223 | std::shared_ptr<Kernel::KEvent> buffer_event; |
| 223 | Core::Memory::Memory& main_memory; | 224 | Core::Memory::Memory& main_memory; |
| 224 | }; | 225 | }; |
| 225 | 226 | ||
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index aa50e73a9..b2b2ffc5a 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include "core/core.h" | 16 | #include "core/core.h" |
| 17 | #include "core/hle/ipc_helpers.h" | 17 | #include "core/hle/ipc_helpers.h" |
| 18 | #include "core/hle/kernel/hle_ipc.h" | 18 | #include "core/hle/kernel/hle_ipc.h" |
| 19 | #include "core/hle/kernel/k_event.h" | ||
| 19 | #include "core/hle/kernel/k_readable_event.h" | 20 | #include "core/hle/kernel/k_readable_event.h" |
| 20 | #include "core/hle/kernel/k_writable_event.h" | 21 | #include "core/hle/kernel/k_writable_event.h" |
| 21 | #include "core/hle/kernel/kernel.h" | 22 | #include "core/hle/kernel/kernel.h" |
| @@ -47,13 +48,13 @@ public: | |||
| 47 | // clang-format on | 48 | // clang-format on |
| 48 | RegisterHandlers(functions); | 49 | RegisterHandlers(functions); |
| 49 | 50 | ||
| 50 | system_event = | 51 | system_event = Kernel::KEvent::Create(system.Kernel(), "IAudioRenderer:SystemEvent"); |
| 51 | Kernel::KWritableEvent::CreateEventPair(system.Kernel(), "IAudioRenderer:SystemEvent"); | 52 | system_event->Initialize(); |
| 52 | renderer = std::make_unique<AudioCore::AudioRenderer>( | 53 | renderer = std::make_unique<AudioCore::AudioRenderer>( |
| 53 | system.CoreTiming(), system.Memory(), audren_params, | 54 | system.CoreTiming(), system.Memory(), audren_params, |
| 54 | [this]() { | 55 | [this]() { |
| 55 | const auto guard = LockService(); | 56 | const auto guard = LockService(); |
| 56 | system_event.writable->Signal(); | 57 | system_event->GetWritableEvent()->Signal(); |
| 57 | }, | 58 | }, |
| 58 | instance_number); | 59 | instance_number); |
| 59 | } | 60 | } |
| @@ -126,7 +127,7 @@ private: | |||
| 126 | 127 | ||
| 127 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 128 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 128 | rb.Push(RESULT_SUCCESS); | 129 | rb.Push(RESULT_SUCCESS); |
| 129 | rb.PushCopyObjects(system_event.readable); | 130 | rb.PushCopyObjects(system_event->GetReadableEvent()); |
| 130 | } | 131 | } |
| 131 | 132 | ||
| 132 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { | 133 | void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { |
| @@ -160,7 +161,7 @@ private: | |||
| 160 | rb.Push(ERR_NOT_SUPPORTED); | 161 | rb.Push(ERR_NOT_SUPPORTED); |
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | Kernel::EventPair system_event; | 164 | std::shared_ptr<Kernel::KEvent> system_event; |
| 164 | std::unique_ptr<AudioCore::AudioRenderer> renderer; | 165 | std::unique_ptr<AudioCore::AudioRenderer> renderer; |
| 165 | u32 rendering_time_limit_percent = 100; | 166 | u32 rendering_time_limit_percent = 100; |
| 166 | }; | 167 | }; |
| @@ -187,17 +188,19 @@ public: | |||
| 187 | RegisterHandlers(functions); | 188 | RegisterHandlers(functions); |
| 188 | 189 | ||
| 189 | auto& kernel = system.Kernel(); | 190 | auto& kernel = system.Kernel(); |
| 190 | buffer_event = | 191 | buffer_event = Kernel::KEvent::Create(kernel, "IAudioOutBufferReleasedEvent"); |
| 191 | Kernel::KWritableEvent::CreateEventPair(kernel, "IAudioOutBufferReleasedEvent"); | 192 | buffer_event->Initialize(); |
| 192 | 193 | ||
| 193 | // Should be similar to audio_output_device_switch_event | 194 | // Should be similar to audio_output_device_switch_event |
| 194 | audio_input_device_switch_event = Kernel::KWritableEvent::CreateEventPair( | 195 | audio_input_device_switch_event = |
| 195 | kernel, "IAudioDevice:AudioInputDeviceSwitchedEvent"); | 196 | Kernel::KEvent::Create(kernel, "IAudioDevice:AudioInputDeviceSwitchedEvent"); |
| 197 | audio_input_device_switch_event->Initialize(); | ||
| 196 | 198 | ||
| 197 | // Should only be signalled when an audio output device has been changed, example: speaker | 199 | // Should only be signalled when an audio output device has been changed, example: speaker |
| 198 | // to headset | 200 | // to headset |
| 199 | audio_output_device_switch_event = Kernel::KWritableEvent::CreateEventPair( | 201 | audio_output_device_switch_event = |
| 200 | kernel, "IAudioDevice:AudioOutputDeviceSwitchedEvent"); | 202 | Kernel::KEvent::Create(kernel, "IAudioDevice:AudioOutputDeviceSwitchedEvent"); |
| 203 | audio_output_device_switch_event->Initialize(); | ||
| 201 | } | 204 | } |
| 202 | 205 | ||
| 203 | private: | 206 | private: |
| @@ -286,11 +289,11 @@ private: | |||
| 286 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { | 289 | void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { |
| 287 | LOG_WARNING(Service_Audio, "(STUBBED) called"); | 290 | LOG_WARNING(Service_Audio, "(STUBBED) called"); |
| 288 | 291 | ||
| 289 | buffer_event.writable->Signal(); | 292 | buffer_event->GetWritableEvent()->Signal(); |
| 290 | 293 | ||
| 291 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 294 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 292 | rb.Push(RESULT_SUCCESS); | 295 | rb.Push(RESULT_SUCCESS); |
| 293 | rb.PushCopyObjects(buffer_event.readable); | 296 | rb.PushCopyObjects(buffer_event->GetReadableEvent()); |
| 294 | } | 297 | } |
| 295 | 298 | ||
| 296 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { | 299 | void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { |
| @@ -307,7 +310,7 @@ private: | |||
| 307 | 310 | ||
| 308 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 311 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 309 | rb.Push(RESULT_SUCCESS); | 312 | rb.Push(RESULT_SUCCESS); |
| 310 | rb.PushCopyObjects(audio_input_device_switch_event.readable); | 313 | rb.PushCopyObjects(audio_input_device_switch_event->GetReadableEvent()); |
| 311 | } | 314 | } |
| 312 | 315 | ||
| 313 | void QueryAudioDeviceOutputEvent(Kernel::HLERequestContext& ctx) { | 316 | void QueryAudioDeviceOutputEvent(Kernel::HLERequestContext& ctx) { |
| @@ -315,13 +318,13 @@ private: | |||
| 315 | 318 | ||
| 316 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 319 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 317 | rb.Push(RESULT_SUCCESS); | 320 | rb.Push(RESULT_SUCCESS); |
| 318 | rb.PushCopyObjects(audio_output_device_switch_event.readable); | 321 | rb.PushCopyObjects(audio_output_device_switch_event->GetReadableEvent()); |
| 319 | } | 322 | } |
| 320 | 323 | ||
| 321 | u32_le revision = 0; | 324 | u32_le revision = 0; |
| 322 | Kernel::EventPair buffer_event; | 325 | std::shared_ptr<Kernel::KEvent> buffer_event; |
| 323 | Kernel::EventPair audio_input_device_switch_event; | 326 | std::shared_ptr<Kernel::KEvent> audio_input_device_switch_event; |
| 324 | Kernel::EventPair audio_output_device_switch_event; | 327 | std::shared_ptr<Kernel::KEvent> audio_output_device_switch_event; |
| 325 | 328 | ||
| 326 | }; // namespace Audio | 329 | }; // namespace Audio |
| 327 | 330 | ||
diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp index 3b853e9e4..92d25dbe4 100644 --- a/src/core/hle/service/bcat/backend/backend.cpp +++ b/src/core/hle/service/bcat/backend/backend.cpp | |||
| @@ -5,6 +5,9 @@ | |||
| 5 | #include "common/hex_util.h" | 5 | #include "common/hex_util.h" |
| 6 | #include "common/logging/log.h" | 6 | #include "common/logging/log.h" |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/hle/kernel/k_event.h" | ||
| 9 | #include "core/hle/kernel/k_readable_event.h" | ||
| 10 | #include "core/hle/kernel/k_writable_event.h" | ||
| 8 | #include "core/hle/lock.h" | 11 | #include "core/hle/lock.h" |
| 9 | #include "core/hle/service/bcat/backend/backend.h" | 12 | #include "core/hle/service/bcat/backend/backend.h" |
| 10 | 13 | ||
| @@ -12,12 +15,13 @@ namespace Service::BCAT { | |||
| 12 | 15 | ||
| 13 | ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel, | 16 | ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel, |
| 14 | std::string_view event_name) { | 17 | std::string_view event_name) { |
| 15 | event = Kernel::KWritableEvent::CreateEventPair( | 18 | event = Kernel::KEvent::Create(kernel, |
| 16 | kernel, std::string("ProgressServiceBackend:UpdateEvent:").append(event_name)); | 19 | "ProgressServiceBackend:UpdateEvent:" + std::string(event_name)); |
| 20 | event->Initialize(); | ||
| 17 | } | 21 | } |
| 18 | 22 | ||
| 19 | std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { | 23 | std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { |
| 20 | return event.readable; | 24 | return event->GetReadableEvent(); |
| 21 | } | 25 | } |
| 22 | 26 | ||
| 23 | DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() { | 27 | DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() { |
| @@ -85,9 +89,9 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) { | |||
| 85 | void ProgressServiceBackend::SignalUpdate() const { | 89 | void ProgressServiceBackend::SignalUpdate() const { |
| 86 | if (need_hle_lock) { | 90 | if (need_hle_lock) { |
| 87 | std::lock_guard lock(HLE::g_hle_lock); | 91 | std::lock_guard lock(HLE::g_hle_lock); |
| 88 | event.writable->Signal(); | 92 | event->GetWritableEvent()->Signal(); |
| 89 | } else { | 93 | } else { |
| 90 | event.writable->Signal(); | 94 | event->GetWritableEvent()->Signal(); |
| 91 | } | 95 | } |
| 92 | } | 96 | } |
| 93 | 97 | ||
diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h index b190943ac..db585b069 100644 --- a/src/core/hle/service/bcat/backend/backend.h +++ b/src/core/hle/service/bcat/backend/backend.h | |||
| @@ -11,8 +11,6 @@ | |||
| 11 | 11 | ||
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "core/file_sys/vfs_types.h" | 13 | #include "core/file_sys/vfs_types.h" |
| 14 | #include "core/hle/kernel/k_readable_event.h" | ||
| 15 | #include "core/hle/kernel/k_writable_event.h" | ||
| 16 | #include "core/hle/result.h" | 14 | #include "core/hle/result.h" |
| 17 | 15 | ||
| 18 | namespace Core { | 16 | namespace Core { |
| @@ -21,7 +19,9 @@ class System; | |||
| 21 | 19 | ||
| 22 | namespace Kernel { | 20 | namespace Kernel { |
| 23 | class KernelCore; | 21 | class KernelCore; |
| 24 | } | 22 | class KEvent; |
| 23 | class KReadableEvent; | ||
| 24 | } // namespace Kernel | ||
| 25 | 25 | ||
| 26 | namespace Service::BCAT { | 26 | namespace Service::BCAT { |
| 27 | 27 | ||
| @@ -104,7 +104,7 @@ private: | |||
| 104 | void SignalUpdate() const; | 104 | void SignalUpdate() const; |
| 105 | 105 | ||
| 106 | DeliveryCacheProgressImpl impl{}; | 106 | DeliveryCacheProgressImpl impl{}; |
| 107 | Kernel::EventPair event; | 107 | std::shared_ptr<Kernel::KEvent> event; |
| 108 | bool need_hle_lock = false; | 108 | bool need_hle_lock = false; |
| 109 | }; | 109 | }; |
| 110 | 110 | ||
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 4c78cd008..17a2ac899 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | #include "core/core.h" | 6 | #include "core/core.h" |
| 7 | #include "core/hle/ipc_helpers.h" | 7 | #include "core/hle/ipc_helpers.h" |
| 8 | #include "core/hle/kernel/hle_ipc.h" | 8 | #include "core/hle/kernel/hle_ipc.h" |
| 9 | #include "core/hle/kernel/k_event.h" | ||
| 9 | #include "core/hle/kernel/k_readable_event.h" | 10 | #include "core/hle/kernel/k_readable_event.h" |
| 10 | #include "core/hle/kernel/k_writable_event.h" | ||
| 11 | #include "core/hle/kernel/kernel.h" | 11 | #include "core/hle/kernel/kernel.h" |
| 12 | #include "core/hle/service/btdrv/btdrv.h" | 12 | #include "core/hle/service/btdrv/btdrv.h" |
| 13 | #include "core/hle/service/service.h" | 13 | #include "core/hle/service/service.h" |
| @@ -35,7 +35,8 @@ public: | |||
| 35 | RegisterHandlers(functions); | 35 | RegisterHandlers(functions); |
| 36 | 36 | ||
| 37 | auto& kernel = system.Kernel(); | 37 | auto& kernel = system.Kernel(); |
| 38 | register_event = Kernel::KWritableEvent::CreateEventPair(kernel, "BT:RegisterEvent"); | 38 | register_event = Kernel::KEvent::Create(kernel, "BT:RegisterEvent"); |
| 39 | register_event->Initialize(); | ||
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | private: | 42 | private: |
| @@ -44,10 +45,10 @@ private: | |||
| 44 | 45 | ||
| 45 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 46 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 46 | rb.Push(RESULT_SUCCESS); | 47 | rb.Push(RESULT_SUCCESS); |
| 47 | rb.PushCopyObjects(register_event.readable); | 48 | rb.PushCopyObjects(register_event->GetReadableEvent()); |
| 48 | } | 49 | } |
| 49 | 50 | ||
| 50 | Kernel::EventPair register_event; | 51 | std::shared_ptr<Kernel::KEvent> register_event; |
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 53 | class BtDrv final : public ServiceFramework<BtDrv> { | 54 | class BtDrv final : public ServiceFramework<BtDrv> { |
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index 3af51d603..9cf2ee92a 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 10 | #include "core/hle/kernel/hle_ipc.h" | 10 | #include "core/hle/kernel/hle_ipc.h" |
| 11 | #include "core/hle/kernel/k_event.h" | ||
| 11 | #include "core/hle/kernel/k_readable_event.h" | 12 | #include "core/hle/kernel/k_readable_event.h" |
| 12 | #include "core/hle/kernel/k_writable_event.h" | ||
| 13 | #include "core/hle/kernel/kernel.h" | 13 | #include "core/hle/kernel/kernel.h" |
| 14 | #include "core/hle/service/btm/btm.h" | 14 | #include "core/hle/service/btm/btm.h" |
| 15 | #include "core/hle/service/service.h" | 15 | #include "core/hle/service/service.h" |
| @@ -58,12 +58,14 @@ public: | |||
| 58 | RegisterHandlers(functions); | 58 | RegisterHandlers(functions); |
| 59 | 59 | ||
| 60 | auto& kernel = system.Kernel(); | 60 | auto& kernel = system.Kernel(); |
| 61 | scan_event = Kernel::KWritableEvent::CreateEventPair(kernel, "IBtmUserCore:ScanEvent"); | 61 | scan_event = Kernel::KEvent::Create(kernel, "IBtmUserCore:ScanEvent"); |
| 62 | connection_event = | 62 | scan_event->Initialize(); |
| 63 | Kernel::KWritableEvent::CreateEventPair(kernel, "IBtmUserCore:ConnectionEvent"); | 63 | connection_event = Kernel::KEvent::Create(kernel, "IBtmUserCore:ConnectionEvent"); |
| 64 | service_discovery = | 64 | connection_event->Initialize(); |
| 65 | Kernel::KWritableEvent::CreateEventPair(kernel, "IBtmUserCore:Discovery"); | 65 | service_discovery = Kernel::KEvent::Create(kernel, "IBtmUserCore:Discovery"); |
| 66 | config_event = Kernel::KWritableEvent::CreateEventPair(kernel, "IBtmUserCore:ConfigEvent"); | 66 | service_discovery->Initialize(); |
| 67 | config_event = Kernel::KEvent::Create(kernel, "IBtmUserCore:ConfigEvent"); | ||
| 68 | config_event->Initialize(); | ||
| 67 | } | 69 | } |
| 68 | 70 | ||
| 69 | private: | 71 | private: |
| @@ -72,7 +74,7 @@ private: | |||
| 72 | 74 | ||
| 73 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 75 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 74 | rb.Push(RESULT_SUCCESS); | 76 | rb.Push(RESULT_SUCCESS); |
| 75 | rb.PushCopyObjects(scan_event.readable); | 77 | rb.PushCopyObjects(scan_event->GetReadableEvent()); |
| 76 | } | 78 | } |
| 77 | 79 | ||
| 78 | void AcquireBleConnectionEvent(Kernel::HLERequestContext& ctx) { | 80 | void AcquireBleConnectionEvent(Kernel::HLERequestContext& ctx) { |
| @@ -80,7 +82,7 @@ private: | |||
| 80 | 82 | ||
| 81 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 83 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 82 | rb.Push(RESULT_SUCCESS); | 84 | rb.Push(RESULT_SUCCESS); |
| 83 | rb.PushCopyObjects(connection_event.readable); | 85 | rb.PushCopyObjects(connection_event->GetReadableEvent()); |
| 84 | } | 86 | } |
| 85 | 87 | ||
| 86 | void AcquireBleServiceDiscoveryEvent(Kernel::HLERequestContext& ctx) { | 88 | void AcquireBleServiceDiscoveryEvent(Kernel::HLERequestContext& ctx) { |
| @@ -88,7 +90,7 @@ private: | |||
| 88 | 90 | ||
| 89 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 91 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 90 | rb.Push(RESULT_SUCCESS); | 92 | rb.Push(RESULT_SUCCESS); |
| 91 | rb.PushCopyObjects(service_discovery.readable); | 93 | rb.PushCopyObjects(service_discovery->GetReadableEvent()); |
| 92 | } | 94 | } |
| 93 | 95 | ||
| 94 | void AcquireBleMtuConfigEvent(Kernel::HLERequestContext& ctx) { | 96 | void AcquireBleMtuConfigEvent(Kernel::HLERequestContext& ctx) { |
| @@ -96,13 +98,13 @@ private: | |||
| 96 | 98 | ||
| 97 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 99 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 98 | rb.Push(RESULT_SUCCESS); | 100 | rb.Push(RESULT_SUCCESS); |
| 99 | rb.PushCopyObjects(config_event.readable); | 101 | rb.PushCopyObjects(config_event->GetReadableEvent()); |
| 100 | } | 102 | } |
| 101 | 103 | ||
| 102 | Kernel::EventPair scan_event; | 104 | std::shared_ptr<Kernel::KEvent> scan_event; |
| 103 | Kernel::EventPair connection_event; | 105 | std::shared_ptr<Kernel::KEvent> connection_event; |
| 104 | Kernel::EventPair service_discovery; | 106 | std::shared_ptr<Kernel::KEvent> service_discovery; |
| 105 | Kernel::EventPair config_event; | 107 | std::shared_ptr<Kernel::KEvent> config_event; |
| 106 | }; | 108 | }; |
| 107 | 109 | ||
| 108 | class BTM_USR final : public ServiceFramework<BTM_USR> { | 110 | class BTM_USR final : public ServiceFramework<BTM_USR> { |
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index fa6cc74ed..72a877d68 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "common/uuid.h" | 7 | #include "common/uuid.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 10 | #include "core/hle/kernel/k_event.h" | ||
| 10 | #include "core/hle/kernel/k_readable_event.h" | 11 | #include "core/hle/kernel/k_readable_event.h" |
| 11 | #include "core/hle/kernel/k_writable_event.h" | 12 | #include "core/hle/kernel/k_writable_event.h" |
| 12 | #include "core/hle/service/friend/errors.h" | 13 | #include "core/hle/service/friend/errors.h" |
| @@ -183,8 +184,9 @@ public: | |||
| 183 | 184 | ||
| 184 | RegisterHandlers(functions); | 185 | RegisterHandlers(functions); |
| 185 | 186 | ||
| 186 | notification_event = Kernel::KWritableEvent::CreateEventPair( | 187 | notification_event = |
| 187 | system.Kernel(), "INotificationService:NotifyEvent"); | 188 | Kernel::KEvent::Create(system.Kernel(), "INotificationService:NotifyEvent"); |
| 189 | notification_event->Initialize(); | ||
| 188 | } | 190 | } |
| 189 | 191 | ||
| 190 | private: | 192 | private: |
| @@ -193,7 +195,7 @@ private: | |||
| 193 | 195 | ||
| 194 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 196 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 195 | rb.Push(RESULT_SUCCESS); | 197 | rb.Push(RESULT_SUCCESS); |
| 196 | rb.PushCopyObjects(notification_event.readable); | 198 | rb.PushCopyObjects(notification_event->GetReadableEvent()); |
| 197 | } | 199 | } |
| 198 | 200 | ||
| 199 | void Clear(Kernel::HLERequestContext& ctx) { | 201 | void Clear(Kernel::HLERequestContext& ctx) { |
| @@ -258,7 +260,7 @@ private: | |||
| 258 | }; | 260 | }; |
| 259 | 261 | ||
| 260 | Common::UUID uuid{Common::INVALID_UUID}; | 262 | Common::UUID uuid{Common::INVALID_UUID}; |
| 261 | Kernel::EventPair notification_event; | 263 | std::shared_ptr<Kernel::KEvent> notification_event; |
| 262 | std::queue<SizedNotificationInfo> notifications; | 264 | std::queue<SizedNotificationInfo> notifications; |
| 263 | States states{}; | 265 | States states{}; |
| 264 | }; | 266 | }; |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 35f93da4f..5794f417c 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include "core/core.h" | 12 | #include "core/core.h" |
| 13 | #include "core/core_timing.h" | 13 | #include "core/core_timing.h" |
| 14 | #include "core/frontend/input.h" | 14 | #include "core/frontend/input.h" |
| 15 | #include "core/hle/kernel/k_event.h" | ||
| 15 | #include "core/hle/kernel/k_readable_event.h" | 16 | #include "core/hle/kernel/k_readable_event.h" |
| 16 | #include "core/hle/kernel/k_writable_event.h" | 17 | #include "core/hle/kernel/k_writable_event.h" |
| 17 | #include "core/hle/kernel/kernel.h" | 18 | #include "core/hle/kernel/kernel.h" |
| @@ -153,7 +154,7 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 153 | const auto controller_type = connected_controllers[controller_idx].type; | 154 | const auto controller_type = connected_controllers[controller_idx].type; |
| 154 | auto& controller = shared_memory_entries[controller_idx]; | 155 | auto& controller = shared_memory_entries[controller_idx]; |
| 155 | if (controller_type == NPadControllerType::None) { | 156 | if (controller_type == NPadControllerType::None) { |
| 156 | styleset_changed_events[controller_idx].writable->Signal(); | 157 | styleset_changed_events[controller_idx]->GetWritableEvent()->Signal(); |
| 157 | return; | 158 | return; |
| 158 | } | 159 | } |
| 159 | controller.joy_styles.raw = 0; // Zero out | 160 | controller.joy_styles.raw = 0; // Zero out |
| @@ -233,8 +234,9 @@ void Controller_NPad::InitNewlyAddedController(std::size_t controller_idx) { | |||
| 233 | void Controller_NPad::OnInit() { | 234 | void Controller_NPad::OnInit() { |
| 234 | auto& kernel = system.Kernel(); | 235 | auto& kernel = system.Kernel(); |
| 235 | for (std::size_t i = 0; i < styleset_changed_events.size(); ++i) { | 236 | for (std::size_t i = 0; i < styleset_changed_events.size(); ++i) { |
| 236 | styleset_changed_events[i] = Kernel::KWritableEvent::CreateEventPair( | 237 | styleset_changed_events[i] = |
| 237 | kernel, fmt::format("npad:NpadStyleSetChanged_{}", i)); | 238 | Kernel::KEvent::Create(kernel, fmt::format("npad:NpadStyleSetChanged_{}", i)); |
| 239 | styleset_changed_events[i]->Initialize(); | ||
| 238 | } | 240 | } |
| 239 | 241 | ||
| 240 | if (!IsControllerActivated()) { | 242 | if (!IsControllerActivated()) { |
| @@ -875,11 +877,11 @@ bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_dev | |||
| 875 | std::shared_ptr<Kernel::KReadableEvent> Controller_NPad::GetStyleSetChangedEvent( | 877 | std::shared_ptr<Kernel::KReadableEvent> Controller_NPad::GetStyleSetChangedEvent( |
| 876 | u32 npad_id) const { | 878 | u32 npad_id) const { |
| 877 | const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; | 879 | const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; |
| 878 | return styleset_event.readable; | 880 | return styleset_event->GetReadableEvent(); |
| 879 | } | 881 | } |
| 880 | 882 | ||
| 881 | void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { | 883 | void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { |
| 882 | styleset_changed_events[NPadIdToIndex(npad_id)].writable->Signal(); | 884 | styleset_changed_events[NPadIdToIndex(npad_id)]->GetWritableEvent()->Signal(); |
| 883 | } | 885 | } |
| 884 | 886 | ||
| 885 | void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) { | 887 | 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 110b56cc4..1a65b19f5 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -9,11 +9,15 @@ | |||
| 9 | #include "common/bit_field.h" | 9 | #include "common/bit_field.h" |
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | #include "core/frontend/input.h" | 11 | #include "core/frontend/input.h" |
| 12 | #include "core/hle/kernel/k_writable_event.h" | ||
| 13 | #include "core/hle/kernel/object.h" | 12 | #include "core/hle/kernel/object.h" |
| 14 | #include "core/hle/service/hid/controllers/controller_base.h" | 13 | #include "core/hle/service/hid/controllers/controller_base.h" |
| 15 | #include "core/settings.h" | 14 | #include "core/settings.h" |
| 16 | 15 | ||
| 16 | namespace Kernel { | ||
| 17 | class KEvent; | ||
| 18 | class KReadableEvent; | ||
| 19 | } // namespace Kernel | ||
| 20 | |||
| 17 | namespace Service::HID { | 21 | namespace Service::HID { |
| 18 | 22 | ||
| 19 | constexpr u32 NPAD_HANDHELD = 32; | 23 | constexpr u32 NPAD_HANDHELD = 32; |
| @@ -452,7 +456,7 @@ private: | |||
| 452 | // NpadCommunicationMode is unknown, default value is 1 | 456 | // NpadCommunicationMode is unknown, default value is 1 |
| 453 | NpadCommunicationMode communication_mode{NpadCommunicationMode::Unknown1}; | 457 | NpadCommunicationMode communication_mode{NpadCommunicationMode::Unknown1}; |
| 454 | // Each controller should have their own styleset changed event | 458 | // Each controller should have their own styleset changed event |
| 455 | std::array<Kernel::EventPair, 10> styleset_changed_events; | 459 | std::array<std::shared_ptr<Kernel::KEvent>, 10> styleset_changed_events; |
| 456 | std::array<std::array<std::chrono::steady_clock::time_point, 2>, 10> last_vibration_timepoints; | 460 | std::array<std::array<std::chrono::steady_clock::time_point, 2>, 10> last_vibration_timepoints; |
| 457 | std::array<std::array<VibrationValue, 2>, 10> latest_vibration_values{}; | 461 | std::array<std::array<VibrationValue, 2>, 10> latest_vibration_values{}; |
| 458 | bool permit_vibration_session_enabled{false}; | 462 | bool permit_vibration_session_enabled{false}; |
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index 0e53aa848..5d6d25696 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/hle/ipc_helpers.h" | 10 | #include "core/hle/ipc_helpers.h" |
| 11 | #include "core/hle/kernel/k_event.h" | ||
| 11 | #include "core/hle/kernel/k_readable_event.h" | 12 | #include "core/hle/kernel/k_readable_event.h" |
| 12 | #include "core/hle/kernel/k_thread.h" | 13 | #include "core/hle/kernel/k_thread.h" |
| 13 | #include "core/hle/kernel/k_writable_event.h" | 14 | #include "core/hle/kernel/k_writable_event.h" |
| @@ -25,7 +26,8 @@ Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& syst | |||
| 25 | const char* name) | 26 | const char* name) |
| 26 | : ServiceFramework{system_, name}, module{std::move(module_)} { | 27 | : ServiceFramework{system_, name}, module{std::move(module_)} { |
| 27 | auto& kernel = system.Kernel(); | 28 | auto& kernel = system.Kernel(); |
| 28 | nfc_tag_load = Kernel::KWritableEvent::CreateEventPair(kernel, "IUser:NFCTagDetected"); | 29 | nfc_tag_load = Kernel::KEvent::Create(kernel, "IUser:NFCTagDetected"); |
| 30 | nfc_tag_load->Initialize(); | ||
| 29 | } | 31 | } |
| 30 | 32 | ||
| 31 | Module::Interface::~Interface() = default; | 33 | Module::Interface::~Interface() = default; |
| @@ -64,9 +66,10 @@ public: | |||
| 64 | RegisterHandlers(functions); | 66 | RegisterHandlers(functions); |
| 65 | 67 | ||
| 66 | auto& kernel = system.Kernel(); | 68 | auto& kernel = system.Kernel(); |
| 67 | deactivate_event = Kernel::KWritableEvent::CreateEventPair(kernel, "IUser:DeactivateEvent"); | 69 | deactivate_event = Kernel::KEvent::Create(kernel, "IUser:DeactivateEvent"); |
| 68 | availability_change_event = | 70 | deactivate_event->Initialize(); |
| 69 | Kernel::KWritableEvent::CreateEventPair(kernel, "IUser:AvailabilityChangeEvent"); | 71 | availability_change_event = Kernel::KEvent::Create(kernel, "IUser:AvailabilityChangeEvent"); |
| 72 | availability_change_event->Initialize(); | ||
| 70 | } | 73 | } |
| 71 | 74 | ||
| 72 | private: | 75 | private: |
| @@ -164,7 +167,7 @@ private: | |||
| 164 | 167 | ||
| 165 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 168 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 166 | rb.Push(RESULT_SUCCESS); | 169 | rb.Push(RESULT_SUCCESS); |
| 167 | rb.PushCopyObjects(deactivate_event.readable); | 170 | rb.PushCopyObjects(deactivate_event->GetReadableEvent()); |
| 168 | } | 171 | } |
| 169 | 172 | ||
| 170 | void StopDetection(Kernel::HLERequestContext& ctx) { | 173 | void StopDetection(Kernel::HLERequestContext& ctx) { |
| @@ -173,7 +176,7 @@ private: | |||
| 173 | switch (device_state) { | 176 | switch (device_state) { |
| 174 | case DeviceState::TagFound: | 177 | case DeviceState::TagFound: |
| 175 | case DeviceState::TagNearby: | 178 | case DeviceState::TagNearby: |
| 176 | deactivate_event.writable->Signal(); | 179 | deactivate_event->GetWritableEvent()->Signal(); |
| 177 | device_state = DeviceState::Initialized; | 180 | device_state = DeviceState::Initialized; |
| 178 | break; | 181 | break; |
| 179 | case DeviceState::SearchingForTag: | 182 | case DeviceState::SearchingForTag: |
| @@ -262,7 +265,7 @@ private: | |||
| 262 | 265 | ||
| 263 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 266 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 264 | rb.Push(RESULT_SUCCESS); | 267 | rb.Push(RESULT_SUCCESS); |
| 265 | rb.PushCopyObjects(availability_change_event.readable); | 268 | rb.PushCopyObjects(availability_change_event->GetReadableEvent()); |
| 266 | } | 269 | } |
| 267 | 270 | ||
| 268 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { | 271 | void GetRegisterInfo(Kernel::HLERequestContext& ctx) { |
| @@ -316,8 +319,8 @@ private: | |||
| 316 | const u32 npad_id{0}; // Player 1 controller | 319 | const u32 npad_id{0}; // Player 1 controller |
| 317 | State state{State::NonInitialized}; | 320 | State state{State::NonInitialized}; |
| 318 | DeviceState device_state{DeviceState::Initialized}; | 321 | DeviceState device_state{DeviceState::Initialized}; |
| 319 | Kernel::EventPair deactivate_event; | 322 | std::shared_ptr<Kernel::KEvent> deactivate_event; |
| 320 | Kernel::EventPair availability_change_event; | 323 | std::shared_ptr<Kernel::KEvent> availability_change_event; |
| 321 | const Module::Interface& nfp_interface; | 324 | const Module::Interface& nfp_interface; |
| 322 | }; | 325 | }; |
| 323 | 326 | ||
| @@ -336,12 +339,12 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { | |||
| 336 | } | 339 | } |
| 337 | 340 | ||
| 338 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); | 341 | std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); |
| 339 | nfc_tag_load.writable->Signal(); | 342 | nfc_tag_load->GetWritableEvent()->Signal(); |
| 340 | return true; | 343 | return true; |
| 341 | } | 344 | } |
| 342 | 345 | ||
| 343 | const std::shared_ptr<Kernel::KReadableEvent>& Module::Interface::GetNFCEvent() const { | 346 | const std::shared_ptr<Kernel::KReadableEvent>& Module::Interface::GetNFCEvent() const { |
| 344 | return nfc_tag_load.readable; | 347 | return nfc_tag_load->GetReadableEvent(); |
| 345 | } | 348 | } |
| 346 | 349 | ||
| 347 | const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { | 350 | 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 9ed5ed0f7..c46551760 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h | |||
| @@ -6,10 +6,13 @@ | |||
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <vector> | 8 | #include <vector> |
| 9 | #include "core/hle/kernel/k_readable_event.h" | 9 | |
| 10 | #include "core/hle/kernel/k_writable_event.h" | ||
| 11 | #include "core/hle/service/service.h" | 10 | #include "core/hle/service/service.h" |
| 12 | 11 | ||
| 12 | namespace Kernel { | ||
| 13 | class KEvent; | ||
| 14 | } | ||
| 15 | |||
| 13 | namespace Service::NFP { | 16 | namespace Service::NFP { |
| 14 | 17 | ||
| 15 | class Module final { | 18 | class Module final { |
| @@ -39,7 +42,7 @@ public: | |||
| 39 | const AmiiboFile& GetAmiiboBuffer() const; | 42 | const AmiiboFile& GetAmiiboBuffer() const; |
| 40 | 43 | ||
| 41 | private: | 44 | private: |
| 42 | Kernel::EventPair nfc_tag_load{}; | 45 | std::shared_ptr<Kernel::KEvent> nfc_tag_load; |
| 43 | AmiiboFile amiibo{}; | 46 | AmiiboFile amiibo{}; |
| 44 | 47 | ||
| 45 | protected: | 48 | protected: |
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 6cb778140..afb3342d6 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | 4 | ||
| 5 | #include "core/core.h" | 5 | #include "core/core.h" |
| 6 | #include "core/hle/ipc_helpers.h" | 6 | #include "core/hle/ipc_helpers.h" |
| 7 | #include "core/hle/kernel/k_event.h" | ||
| 7 | #include "core/hle/kernel/k_readable_event.h" | 8 | #include "core/hle/kernel/k_readable_event.h" |
| 8 | #include "core/hle/kernel/k_writable_event.h" | ||
| 9 | #include "core/hle/kernel/kernel.h" | 9 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/service/nifm/nifm.h" | 10 | #include "core/hle/service/nifm/nifm.h" |
| 11 | #include "core/hle/service/service.h" | 11 | #include "core/hle/service/service.h" |
| @@ -158,8 +158,11 @@ public: | |||
| 158 | RegisterHandlers(functions); | 158 | RegisterHandlers(functions); |
| 159 | 159 | ||
| 160 | auto& kernel = system.Kernel(); | 160 | auto& kernel = system.Kernel(); |
| 161 | event1 = Kernel::KWritableEvent::CreateEventPair(kernel, "IRequest:Event1"); | 161 | |
| 162 | event2 = Kernel::KWritableEvent::CreateEventPair(kernel, "IRequest:Event2"); | 162 | event1 = Kernel::KEvent::Create(kernel, "IRequest:Event1"); |
| 163 | event1->Initialize(); | ||
| 164 | event2 = Kernel::KEvent::Create(kernel, "IRequest:Event2"); | ||
| 165 | event2->Initialize(); | ||
| 163 | } | 166 | } |
| 164 | 167 | ||
| 165 | private: | 168 | private: |
| @@ -195,7 +198,7 @@ private: | |||
| 195 | 198 | ||
| 196 | IPC::ResponseBuilder rb{ctx, 2, 2}; | 199 | IPC::ResponseBuilder rb{ctx, 2, 2}; |
| 197 | rb.Push(RESULT_SUCCESS); | 200 | rb.Push(RESULT_SUCCESS); |
| 198 | rb.PushCopyObjects(event1.readable, event2.readable); | 201 | rb.PushCopyObjects(event1->GetReadableEvent(), event2->GetReadableEvent()); |
| 199 | } | 202 | } |
| 200 | 203 | ||
| 201 | void Cancel(Kernel::HLERequestContext& ctx) { | 204 | void Cancel(Kernel::HLERequestContext& ctx) { |
| @@ -226,7 +229,7 @@ private: | |||
| 226 | rb.Push<u32>(0); | 229 | rb.Push<u32>(0); |
| 227 | } | 230 | } |
| 228 | 231 | ||
| 229 | Kernel::EventPair event1, event2; | 232 | std::shared_ptr<Kernel::KEvent> event1, event2; |
| 230 | }; | 233 | }; |
| 231 | 234 | ||
| 232 | class INetworkProfile final : public ServiceFramework<INetworkProfile> { | 235 | class INetworkProfile final : public ServiceFramework<INetworkProfile> { |
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index f180221fe..f3be0b878 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <ctime> | 6 | #include <ctime> |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/hle/ipc_helpers.h" | 8 | #include "core/hle/ipc_helpers.h" |
| 9 | #include "core/hle/kernel/k_event.h" | ||
| 9 | #include "core/hle/kernel/k_readable_event.h" | 10 | #include "core/hle/kernel/k_readable_event.h" |
| 10 | #include "core/hle/kernel/k_writable_event.h" | 11 | #include "core/hle/kernel/k_writable_event.h" |
| 11 | #include "core/hle/kernel/kernel.h" | 12 | #include "core/hle/kernel/kernel.h" |
| @@ -301,17 +302,18 @@ public: | |||
| 301 | RegisterHandlers(functions); | 302 | RegisterHandlers(functions); |
| 302 | 303 | ||
| 303 | auto& kernel = system.Kernel(); | 304 | auto& kernel = system.Kernel(); |
| 304 | finished_event = Kernel::KWritableEvent::CreateEventPair( | 305 | finished_event = |
| 305 | kernel, "IEnsureNetworkClockAvailabilityService:FinishEvent"); | 306 | Kernel::KEvent::Create(kernel, "IEnsureNetworkClockAvailabilityService:FinishEvent"); |
| 307 | finished_event->Initialize(); | ||
| 306 | } | 308 | } |
| 307 | 309 | ||
| 308 | private: | 310 | private: |
| 309 | Kernel::EventPair finished_event; | 311 | std::shared_ptr<Kernel::KEvent> finished_event; |
| 310 | 312 | ||
| 311 | void StartTask(Kernel::HLERequestContext& ctx) { | 313 | void StartTask(Kernel::HLERequestContext& ctx) { |
| 312 | // No need to connect to the internet, just finish the task straight away. | 314 | // No need to connect to the internet, just finish the task straight away. |
| 313 | LOG_DEBUG(Service_NIM, "called"); | 315 | LOG_DEBUG(Service_NIM, "called"); |
| 314 | finished_event.writable->Signal(); | 316 | finished_event->GetWritableEvent()->Signal(); |
| 315 | IPC::ResponseBuilder rb{ctx, 2}; | 317 | IPC::ResponseBuilder rb{ctx, 2}; |
| 316 | rb.Push(RESULT_SUCCESS); | 318 | rb.Push(RESULT_SUCCESS); |
| 317 | } | 319 | } |
| @@ -321,7 +323,7 @@ private: | |||
| 321 | 323 | ||
| 322 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 324 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 323 | rb.Push(RESULT_SUCCESS); | 325 | rb.Push(RESULT_SUCCESS); |
| 324 | rb.PushCopyObjects(finished_event.readable); | 326 | rb.PushCopyObjects(finished_event->GetReadableEvent()); |
| 325 | } | 327 | } |
| 326 | 328 | ||
| 327 | void GetResult(Kernel::HLERequestContext& ctx) { | 329 | void GetResult(Kernel::HLERequestContext& ctx) { |
| @@ -333,7 +335,7 @@ private: | |||
| 333 | 335 | ||
| 334 | void Cancel(Kernel::HLERequestContext& ctx) { | 336 | void Cancel(Kernel::HLERequestContext& ctx) { |
| 335 | LOG_DEBUG(Service_NIM, "called"); | 337 | LOG_DEBUG(Service_NIM, "called"); |
| 336 | finished_event.writable->Clear(); | 338 | finished_event->GetWritableEvent()->Clear(); |
| 337 | IPC::ResponseBuilder rb{ctx, 2}; | 339 | IPC::ResponseBuilder rb{ctx, 2}; |
| 338 | rb.Push(RESULT_SUCCESS); | 340 | rb.Push(RESULT_SUCCESS); |
| 339 | } | 341 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 695e2fb10..f6129ef10 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include "common/assert.h" | 8 | #include "common/assert.h" |
| 9 | #include "common/logging/log.h" | 9 | #include "common/logging/log.h" |
| 10 | #include "core/core.h" | 10 | #include "core/core.h" |
| 11 | #include "core/hle/kernel/k_readable_event.h" | 11 | #include "core/hle/kernel/k_event.h" |
| 12 | #include "core/hle/kernel/k_writable_event.h" | 12 | #include "core/hle/kernel/k_writable_event.h" |
| 13 | #include "core/hle/service/nvdrv/devices/nvhost_ctrl.h" | 13 | #include "core/hle/service/nvdrv/devices/nvhost_ctrl.h" |
| 14 | #include "video_core/gpu.h" | 14 | #include "video_core/gpu.h" |
| @@ -103,14 +103,14 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector | |||
| 103 | // This is mostly to take into account unimplemented features. As synced | 103 | // This is mostly to take into account unimplemented features. As synced |
| 104 | // gpu is always synced. | 104 | // gpu is always synced. |
| 105 | if (!gpu.IsAsync()) { | 105 | if (!gpu.IsAsync()) { |
| 106 | event.event.writable->Signal(); | 106 | event.event->GetWritableEvent()->Signal(); |
| 107 | return NvResult::Success; | 107 | return NvResult::Success; |
| 108 | } | 108 | } |
| 109 | auto lock = gpu.LockSync(); | 109 | auto lock = gpu.LockSync(); |
| 110 | const u32 current_syncpoint_value = event.fence.value; | 110 | const u32 current_syncpoint_value = event.fence.value; |
| 111 | const s32 diff = current_syncpoint_value - params.threshold; | 111 | const s32 diff = current_syncpoint_value - params.threshold; |
| 112 | if (diff >= 0) { | 112 | if (diff >= 0) { |
| 113 | event.event.writable->Signal(); | 113 | event.event->GetWritableEvent()->Signal(); |
| 114 | params.value = current_syncpoint_value; | 114 | params.value = current_syncpoint_value; |
| 115 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 115 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 116 | return NvResult::Success; | 116 | return NvResult::Success; |
| @@ -137,7 +137,7 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector | |||
| 137 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; | 137 | params.value = ((params.syncpt_id & 0xfff) << 16) | 0x10000000; |
| 138 | } | 138 | } |
| 139 | params.value |= event_id; | 139 | params.value |= event_id; |
| 140 | event.event.writable->Clear(); | 140 | event.event->GetWritableEvent()->Clear(); |
| 141 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); | 141 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); |
| 142 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 142 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 143 | return NvResult::Timeout; | 143 | return NvResult::Timeout; |
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index b6c4c85e0..abba80112 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <fmt/format.h> | 7 | #include <fmt/format.h> |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 10 | #include "core/hle/kernel/k_event.h" | ||
| 10 | #include "core/hle/kernel/k_readable_event.h" | 11 | #include "core/hle/kernel/k_readable_event.h" |
| 11 | #include "core/hle/kernel/k_writable_event.h" | 12 | #include "core/hle/kernel/k_writable_event.h" |
| 12 | #include "core/hle/service/nvdrv/devices/nvdevice.h" | 13 | #include "core/hle/service/nvdrv/devices/nvdevice.h" |
| @@ -42,7 +43,8 @@ Module::Module(Core::System& system) : syncpoint_manager{system.GPU()} { | |||
| 42 | auto& kernel = system.Kernel(); | 43 | auto& kernel = system.Kernel(); |
| 43 | for (u32 i = 0; i < MaxNvEvents; i++) { | 44 | for (u32 i = 0; i < MaxNvEvents; i++) { |
| 44 | std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); | 45 | std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); |
| 45 | events_interface.events[i] = {Kernel::KWritableEvent::CreateEventPair(kernel, event_label)}; | 46 | events_interface.events[i] = {Kernel::KEvent::Create(kernel, std::move(event_label))}; |
| 47 | events_interface.events[i].event->Initialize(); | ||
| 46 | events_interface.status[i] = EventState::Free; | 48 | events_interface.status[i] = EventState::Free; |
| 47 | events_interface.registered[i] = false; | 49 | events_interface.registered[i] = false; |
| 48 | } | 50 | } |
| @@ -166,17 +168,17 @@ void Module::SignalSyncpt(const u32 syncpoint_id, const u32 value) { | |||
| 166 | if (events_interface.assigned_syncpt[i] == syncpoint_id && | 168 | if (events_interface.assigned_syncpt[i] == syncpoint_id && |
| 167 | events_interface.assigned_value[i] == value) { | 169 | events_interface.assigned_value[i] == value) { |
| 168 | events_interface.LiberateEvent(i); | 170 | events_interface.LiberateEvent(i); |
| 169 | events_interface.events[i].event.writable->Signal(); | 171 | events_interface.events[i].event->GetWritableEvent()->Signal(); |
| 170 | } | 172 | } |
| 171 | } | 173 | } |
| 172 | } | 174 | } |
| 173 | 175 | ||
| 174 | std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { | 176 | std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { |
| 175 | return events_interface.events[event_id].event.readable; | 177 | return events_interface.events[event_id].event->GetReadableEvent(); |
| 176 | } | 178 | } |
| 177 | 179 | ||
| 178 | std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { | 180 | std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { |
| 179 | return events_interface.events[event_id].event.writable; | 181 | return events_interface.events[event_id].event->GetWritableEvent(); |
| 180 | } | 182 | } |
| 181 | 183 | ||
| 182 | } // namespace Service::Nvidia | 184 | } // namespace Service::Nvidia |
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index 0d638e521..53719aadd 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include <memory> | 7 | #include <memory> |
| 8 | #include <unordered_map> | 8 | #include <unordered_map> |
| 9 | #include <vector> | 9 | #include <vector> |
| 10 | |||
| 10 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 11 | #include "core/hle/kernel/k_writable_event.h" | ||
| 12 | #include "core/hle/service/nvdrv/nvdata.h" | 12 | #include "core/hle/service/nvdrv/nvdata.h" |
| 13 | #include "core/hle/service/nvdrv/syncpoint_manager.h" | 13 | #include "core/hle/service/nvdrv/syncpoint_manager.h" |
| 14 | #include "core/hle/service/service.h" | 14 | #include "core/hle/service/service.h" |
| @@ -17,6 +17,10 @@ namespace Core { | |||
| 17 | class System; | 17 | class System; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | namespace Kernel { | ||
| 21 | class KEvent; | ||
| 22 | } | ||
| 23 | |||
| 20 | namespace Service::NVFlinger { | 24 | namespace Service::NVFlinger { |
| 21 | class NVFlinger; | 25 | class NVFlinger; |
| 22 | } | 26 | } |
| @@ -31,7 +35,7 @@ class nvdevice; | |||
| 31 | 35 | ||
| 32 | /// Represents an Nvidia event | 36 | /// Represents an Nvidia event |
| 33 | struct NvEvent { | 37 | struct NvEvent { |
| 34 | Kernel::EventPair event; | 38 | std::shared_ptr<Kernel::KEvent> event; |
| 35 | Fence fence{}; | 39 | Fence fence{}; |
| 36 | }; | 40 | }; |
| 37 | 41 | ||
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 805f178aa..7842a82ed 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include "common/assert.h" | 7 | #include "common/assert.h" |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/hle/kernel/k_readable_event.h" | 10 | #include "core/hle/kernel/k_event.h" |
| 11 | #include "core/hle/kernel/k_writable_event.h" | 11 | #include "core/hle/kernel/k_writable_event.h" |
| 12 | #include "core/hle/kernel/kernel.h" | 12 | #include "core/hle/kernel/kernel.h" |
| 13 | #include "core/hle/service/nvflinger/buffer_queue.h" | 13 | #include "core/hle/service/nvflinger/buffer_queue.h" |
| @@ -16,7 +16,8 @@ namespace Service::NVFlinger { | |||
| 16 | 16 | ||
| 17 | BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id, u64 layer_id) | 17 | BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id, u64 layer_id) |
| 18 | : id(id), layer_id(layer_id) { | 18 | : id(id), layer_id(layer_id) { |
| 19 | buffer_wait_event = Kernel::KWritableEvent::CreateEventPair(kernel, "BufferQueue NativeHandle"); | 19 | buffer_wait_event = Kernel::KEvent::Create(kernel, "BufferQueue:WaitEvent"); |
| 20 | buffer_wait_event->Initialize(); | ||
| 20 | } | 21 | } |
| 21 | 22 | ||
| 22 | BufferQueue::~BufferQueue() = default; | 23 | BufferQueue::~BufferQueue() = default; |
| @@ -41,7 +42,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) | |||
| 41 | .multi_fence = {}, | 42 | .multi_fence = {}, |
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| 44 | buffer_wait_event.writable->Signal(); | 45 | buffer_wait_event->GetWritableEvent()->Signal(); |
| 45 | } | 46 | } |
| 46 | 47 | ||
| 47 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, | 48 | std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, |
| @@ -119,7 +120,7 @@ void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& mult | |||
| 119 | } | 120 | } |
| 120 | free_buffers_condition.notify_one(); | 121 | free_buffers_condition.notify_one(); |
| 121 | 122 | ||
| 122 | buffer_wait_event.writable->Signal(); | 123 | buffer_wait_event->GetWritableEvent()->Signal(); |
| 123 | } | 124 | } |
| 124 | 125 | ||
| 125 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { | 126 | std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { |
| @@ -154,7 +155,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) { | |||
| 154 | } | 155 | } |
| 155 | free_buffers_condition.notify_one(); | 156 | free_buffers_condition.notify_one(); |
| 156 | 157 | ||
| 157 | buffer_wait_event.writable->Signal(); | 158 | buffer_wait_event->GetWritableEvent()->Signal(); |
| 158 | } | 159 | } |
| 159 | 160 | ||
| 160 | void BufferQueue::Connect() { | 161 | void BufferQueue::Connect() { |
| @@ -169,7 +170,7 @@ void BufferQueue::Disconnect() { | |||
| 169 | std::unique_lock lock{queue_sequence_mutex}; | 170 | std::unique_lock lock{queue_sequence_mutex}; |
| 170 | queue_sequence.clear(); | 171 | queue_sequence.clear(); |
| 171 | } | 172 | } |
| 172 | buffer_wait_event.writable->Signal(); | 173 | buffer_wait_event->GetWritableEvent()->Signal(); |
| 173 | is_connect = false; | 174 | is_connect = false; |
| 174 | free_buffers_condition.notify_one(); | 175 | free_buffers_condition.notify_one(); |
| 175 | } | 176 | } |
| @@ -189,11 +190,11 @@ u32 BufferQueue::Query(QueryType type) { | |||
| 189 | } | 190 | } |
| 190 | 191 | ||
| 191 | std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { | 192 | std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { |
| 192 | return buffer_wait_event.writable; | 193 | return buffer_wait_event->GetWritableEvent(); |
| 193 | } | 194 | } |
| 194 | 195 | ||
| 195 | std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { | 196 | std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { |
| 196 | return buffer_wait_event.readable; | 197 | return buffer_wait_event->GetReadableEvent(); |
| 197 | } | 198 | } |
| 198 | 199 | ||
| 199 | } // namespace Service::NVFlinger | 200 | } // namespace Service::NVFlinger |
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index 4de144113..163fa4c54 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h | |||
| @@ -13,13 +13,15 @@ | |||
| 13 | #include "common/common_funcs.h" | 13 | #include "common/common_funcs.h" |
| 14 | #include "common/math_util.h" | 14 | #include "common/math_util.h" |
| 15 | #include "common/swap.h" | 15 | #include "common/swap.h" |
| 16 | #include "core/hle/kernel/k_writable_event.h" | ||
| 17 | #include "core/hle/kernel/object.h" | 16 | #include "core/hle/kernel/object.h" |
| 18 | #include "core/hle/service/nvdrv/nvdata.h" | 17 | #include "core/hle/service/nvdrv/nvdata.h" |
| 19 | 18 | ||
| 20 | namespace Kernel { | 19 | namespace Kernel { |
| 21 | class KernelCore; | 20 | class KernelCore; |
| 22 | } | 21 | class KEvent; |
| 22 | class KReadableEvent; | ||
| 23 | class KWritableEvent; | ||
| 24 | } // namespace Kernel | ||
| 23 | 25 | ||
| 24 | namespace Service::NVFlinger { | 26 | namespace Service::NVFlinger { |
| 25 | 27 | ||
| @@ -127,7 +129,7 @@ private: | |||
| 127 | std::list<u32> free_buffers; | 129 | std::list<u32> free_buffers; |
| 128 | std::array<Buffer, buffer_slots> buffers; | 130 | std::array<Buffer, buffer_slots> buffers; |
| 129 | std::list<u32> queue_sequence; | 131 | std::list<u32> queue_sequence; |
| 130 | Kernel::EventPair buffer_wait_event; | 132 | std::shared_ptr<Kernel::KEvent> buffer_wait_event; |
| 131 | 133 | ||
| 132 | std::mutex free_buffers_mutex; | 134 | std::mutex free_buffers_mutex; |
| 133 | std::condition_variable free_buffers_condition; | 135 | std::condition_variable free_buffers_condition; |
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index c1f7b33f1..26ed52273 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 10 | #include "core/hle/kernel/k_event.h" | ||
| 10 | #include "core/hle/kernel/k_readable_event.h" | 11 | #include "core/hle/kernel/k_readable_event.h" |
| 11 | #include "core/hle/kernel/k_writable_event.h" | 12 | #include "core/hle/kernel/k_writable_event.h" |
| 12 | #include "core/hle/kernel/kernel.h" | 13 | #include "core/hle/kernel/kernel.h" |
| @@ -31,27 +32,28 @@ public: | |||
| 31 | 32 | ||
| 32 | RegisterHandlers(functions); | 33 | RegisterHandlers(functions); |
| 33 | 34 | ||
| 34 | state_change_event = Kernel::KWritableEvent::CreateEventPair( | 35 | state_change_event = |
| 35 | system_.Kernel(), "IPsmSession::state_change_event"); | 36 | Kernel::KEvent::Create(system_.Kernel(), "IPsmSession::state_change_event"); |
| 37 | state_change_event->Initialize(); | ||
| 36 | } | 38 | } |
| 37 | 39 | ||
| 38 | ~IPsmSession() override = default; | 40 | ~IPsmSession() override = default; |
| 39 | 41 | ||
| 40 | void SignalChargerTypeChanged() { | 42 | void SignalChargerTypeChanged() { |
| 41 | if (should_signal && should_signal_charger_type) { | 43 | if (should_signal && should_signal_charger_type) { |
| 42 | state_change_event.writable->Signal(); | 44 | state_change_event->GetWritableEvent()->Signal(); |
| 43 | } | 45 | } |
| 44 | } | 46 | } |
| 45 | 47 | ||
| 46 | void SignalPowerSupplyChanged() { | 48 | void SignalPowerSupplyChanged() { |
| 47 | if (should_signal && should_signal_power_supply) { | 49 | if (should_signal && should_signal_power_supply) { |
| 48 | state_change_event.writable->Signal(); | 50 | state_change_event->GetWritableEvent()->Signal(); |
| 49 | } | 51 | } |
| 50 | } | 52 | } |
| 51 | 53 | ||
| 52 | void SignalBatteryVoltageStateChanged() { | 54 | void SignalBatteryVoltageStateChanged() { |
| 53 | if (should_signal && should_signal_battery_voltage) { | 55 | if (should_signal && should_signal_battery_voltage) { |
| 54 | state_change_event.writable->Signal(); | 56 | state_change_event->GetWritableEvent()->Signal(); |
| 55 | } | 57 | } |
| 56 | } | 58 | } |
| 57 | 59 | ||
| @@ -63,7 +65,7 @@ private: | |||
| 63 | 65 | ||
| 64 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 66 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 65 | rb.Push(RESULT_SUCCESS); | 67 | rb.Push(RESULT_SUCCESS); |
| 66 | rb.PushCopyObjects(state_change_event.readable); | 68 | rb.PushCopyObjects(state_change_event->GetReadableEvent()); |
| 67 | } | 69 | } |
| 68 | 70 | ||
| 69 | void UnbindStateChangeEvent(Kernel::HLERequestContext& ctx) { | 71 | void UnbindStateChangeEvent(Kernel::HLERequestContext& ctx) { |
| @@ -112,7 +114,7 @@ private: | |||
| 112 | bool should_signal_power_supply{}; | 114 | bool should_signal_power_supply{}; |
| 113 | bool should_signal_battery_voltage{}; | 115 | bool should_signal_battery_voltage{}; |
| 114 | bool should_signal{}; | 116 | bool should_signal{}; |
| 115 | Kernel::EventPair state_change_event; | 117 | std::shared_ptr<Kernel::KEvent> state_change_event; |
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | class PSM final : public ServiceFramework<PSM> { | 120 | class PSM final : public ServiceFramework<PSM> { |
diff --git a/src/core/hle/service/time/standard_user_system_clock_core.cpp b/src/core/hle/service/time/standard_user_system_clock_core.cpp index 9362350a0..b9faa474e 100644 --- a/src/core/hle/service/time/standard_user_system_clock_core.cpp +++ b/src/core/hle/service/time/standard_user_system_clock_core.cpp | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #include "common/assert.h" | 5 | #include "common/assert.h" |
| 6 | #include "core/core.h" | 6 | #include "core/core.h" |
| 7 | #include "core/hle/kernel/k_writable_event.h" | 7 | #include "core/hle/kernel/k_event.h" |
| 8 | #include "core/hle/service/time/standard_local_system_clock_core.h" | 8 | #include "core/hle/service/time/standard_local_system_clock_core.h" |
| 9 | #include "core/hle/service/time/standard_network_system_clock_core.h" | 9 | #include "core/hle/service/time/standard_network_system_clock_core.h" |
| 10 | #include "core/hle/service/time/standard_user_system_clock_core.h" | 10 | #include "core/hle/service/time/standard_user_system_clock_core.h" |
| @@ -18,8 +18,10 @@ StandardUserSystemClockCore::StandardUserSystemClockCore( | |||
| 18 | local_system_clock_core{local_system_clock_core}, | 18 | local_system_clock_core{local_system_clock_core}, |
| 19 | network_system_clock_core{network_system_clock_core}, auto_correction_enabled{}, | 19 | network_system_clock_core{network_system_clock_core}, auto_correction_enabled{}, |
| 20 | auto_correction_time{SteadyClockTimePoint::GetRandom()}, | 20 | auto_correction_time{SteadyClockTimePoint::GetRandom()}, |
| 21 | auto_correction_event{Kernel::KWritableEvent::CreateEventPair( | 21 | auto_correction_event{Kernel::KEvent::Create( |
| 22 | system.Kernel(), "StandardUserSystemClockCore:AutoCorrectionEvent")} {} | 22 | system.Kernel(), "StandardUserSystemClockCore:AutoCorrectionEvent")} { |
| 23 | auto_correction_event->Initialize(); | ||
| 24 | } | ||
| 23 | 25 | ||
| 24 | ResultCode StandardUserSystemClockCore::SetAutomaticCorrectionEnabled(Core::System& system, | 26 | ResultCode StandardUserSystemClockCore::SetAutomaticCorrectionEnabled(Core::System& system, |
| 25 | bool value) { | 27 | bool value) { |
diff --git a/src/core/hle/service/time/standard_user_system_clock_core.h b/src/core/hle/service/time/standard_user_system_clock_core.h index 30d3a2a0d..aac44d72f 100644 --- a/src/core/hle/service/time/standard_user_system_clock_core.h +++ b/src/core/hle/service/time/standard_user_system_clock_core.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include "core/hle/kernel/k_writable_event.h" | ||
| 8 | #include "core/hle/service/time/clock_types.h" | 7 | #include "core/hle/service/time/clock_types.h" |
| 9 | #include "core/hle/service/time/system_clock_core.h" | 8 | #include "core/hle/service/time/system_clock_core.h" |
| 10 | 9 | ||
| @@ -12,6 +11,10 @@ namespace Core { | |||
| 12 | class System; | 11 | class System; |
| 13 | } | 12 | } |
| 14 | 13 | ||
| 14 | namespace Kernel { | ||
| 15 | class KEvent; | ||
| 16 | } | ||
| 17 | |||
| 15 | namespace Service::Time::Clock { | 18 | namespace Service::Time::Clock { |
| 16 | 19 | ||
| 17 | class StandardLocalSystemClockCore; | 20 | class StandardLocalSystemClockCore; |
| @@ -51,7 +54,7 @@ private: | |||
| 51 | StandardNetworkSystemClockCore& network_system_clock_core; | 54 | StandardNetworkSystemClockCore& network_system_clock_core; |
| 52 | bool auto_correction_enabled{}; | 55 | bool auto_correction_enabled{}; |
| 53 | SteadyClockTimePoint auto_correction_time; | 56 | SteadyClockTimePoint auto_correction_time; |
| 54 | Kernel::EventPair auto_correction_event; | 57 | std::shared_ptr<Kernel::KEvent> auto_correction_event; |
| 55 | }; | 58 | }; |
| 56 | 59 | ||
| 57 | } // namespace Service::Time::Clock | 60 | } // namespace Service::Time::Clock |
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp index 02d5287a9..7f42aa4a0 100644 --- a/src/core/hle/service/vi/display/vi_display.cpp +++ b/src/core/hle/service/vi/display/vi_display.cpp | |||
| @@ -9,7 +9,9 @@ | |||
| 9 | 9 | ||
| 10 | #include "common/assert.h" | 10 | #include "common/assert.h" |
| 11 | #include "core/core.h" | 11 | #include "core/core.h" |
| 12 | #include "core/hle/kernel/k_event.h" | ||
| 12 | #include "core/hle/kernel/k_readable_event.h" | 13 | #include "core/hle/kernel/k_readable_event.h" |
| 14 | #include "core/hle/kernel/k_writable_event.h" | ||
| 13 | #include "core/hle/service/vi/display/vi_display.h" | 15 | #include "core/hle/service/vi/display/vi_display.h" |
| 14 | #include "core/hle/service/vi/layer/vi_layer.h" | 16 | #include "core/hle/service/vi/layer/vi_layer.h" |
| 15 | 17 | ||
| @@ -17,8 +19,8 @@ namespace Service::VI { | |||
| 17 | 19 | ||
| 18 | Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{std::move(name)} { | 20 | Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{std::move(name)} { |
| 19 | auto& kernel = system.Kernel(); | 21 | auto& kernel = system.Kernel(); |
| 20 | vsync_event = | 22 | vsync_event = Kernel::KEvent::Create(kernel, fmt::format("Display VSync Event {}", id)); |
| 21 | Kernel::KWritableEvent::CreateEventPair(kernel, fmt::format("Display VSync Event {}", id)); | 23 | vsync_event->Initialize(); |
| 22 | } | 24 | } |
| 23 | 25 | ||
| 24 | Display::~Display() = default; | 26 | Display::~Display() = default; |
| @@ -32,11 +34,11 @@ const Layer& Display::GetLayer(std::size_t index) const { | |||
| 32 | } | 34 | } |
| 33 | 35 | ||
| 34 | std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { | 36 | std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { |
| 35 | return vsync_event.readable; | 37 | return vsync_event->GetReadableEvent(); |
| 36 | } | 38 | } |
| 37 | 39 | ||
| 38 | void Display::SignalVSyncEvent() { | 40 | void Display::SignalVSyncEvent() { |
| 39 | vsync_event.writable->Signal(); | 41 | vsync_event->GetWritableEvent()->Signal(); |
| 40 | } | 42 | } |
| 41 | 43 | ||
| 42 | void Display::CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue) { | 44 | void Display::CreateLayer(u64 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 b576c9cf2..931c898f6 100644 --- a/src/core/hle/service/vi/display/vi_display.h +++ b/src/core/hle/service/vi/display/vi_display.h | |||
| @@ -9,7 +9,10 @@ | |||
| 9 | #include <vector> | 9 | #include <vector> |
| 10 | 10 | ||
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | #include "core/hle/kernel/k_writable_event.h" | 12 | |
| 13 | namespace Kernel { | ||
| 14 | class KEvent; | ||
| 15 | } | ||
| 13 | 16 | ||
| 14 | namespace Service::NVFlinger { | 17 | namespace Service::NVFlinger { |
| 15 | class BufferQueue; | 18 | class BufferQueue; |
| @@ -99,7 +102,7 @@ private: | |||
| 99 | std::string name; | 102 | std::string name; |
| 100 | 103 | ||
| 101 | std::vector<std::shared_ptr<Layer>> layers; | 104 | std::vector<std::shared_ptr<Layer>> layers; |
| 102 | Kernel::EventPair vsync_event; | 105 | std::shared_ptr<Kernel::KEvent> vsync_event; |
| 103 | }; | 106 | }; |
| 104 | 107 | ||
| 105 | } // namespace Service::VI | 108 | } // namespace Service::VI |