summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_readable_event.cpp44
-rw-r--r--src/core/hle/kernel/k_readable_event.h42
-rw-r--r--src/core/hle/kernel/k_synchronization_object.cpp3
-rw-r--r--src/core/hle/kernel/k_synchronization_object.h1
-rw-r--r--src/core/hle/kernel/k_writable_event.cpp34
-rw-r--r--src/core/hle/kernel/k_writable_event.h40
-rw-r--r--src/core/hle/kernel/object.cpp6
-rw-r--r--src/core/hle/kernel/object.h7
-rw-r--r--src/core/hle/kernel/svc.cpp9
-rw-r--r--src/core/hle/service/am/am.cpp67
-rw-r--r--src/core/hle/service/am/am.h19
-rw-r--r--src/core/hle/service/am/applets/applets.cpp30
-rw-r--r--src/core/hle/service/am/applets/applets.h12
-rw-r--r--src/core/hle/service/aoc/aoc_u.cpp18
-rw-r--r--src/core/hle/service/aoc/aoc_u.h4
-rw-r--r--src/core/hle/service/audio/audout_u.cpp11
-rw-r--r--src/core/hle/service/audio/audren_u.cpp39
-rw-r--r--src/core/hle/service/bcat/backend/backend.cpp14
-rw-r--r--src/core/hle/service/bcat/backend/backend.h8
-rw-r--r--src/core/hle/service/btdrv/btdrv.cpp9
-rw-r--r--src/core/hle/service/btm/btm.cpp32
-rw-r--r--src/core/hle/service/friend/friend.cpp10
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp12
-rw-r--r--src/core/hle/service/hid/controllers/npad.h8
-rw-r--r--src/core/hle/service/nfp/nfp.cpp25
-rw-r--r--src/core/hle/service/nfp/nfp.h9
-rw-r--r--src/core/hle/service/nifm/nifm.cpp13
-rw-r--r--src/core/hle/service/nim/nim.cpp14
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp8
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp10
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.h8
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp17
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h8
-rw-r--r--src/core/hle/service/ptm/psm.cpp16
-rw-r--r--src/core/hle/service/time/standard_user_system_clock_core.cpp8
-rw-r--r--src/core/hle/service/time/standard_user_system_clock_core.h7
-rw-r--r--src/core/hle/service/vi/display/vi_display.cpp10
-rw-r--r--src/core/hle/service/vi/display/vi_display.h7
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
15namespace Kernel { 17namespace Kernel {
16 18
17KReadableEvent::KReadableEvent(KernelCore& kernel) : KSynchronizationObject{kernel} {} 19KReadableEvent::KReadableEvent(KernelCore& kernel, std::string&& name)
20 : KSynchronizationObject{kernel, std::move(name)} {}
18KReadableEvent::~KReadableEvent() = default; 21KReadableEvent::~KReadableEvent() = default;
19 22
20void KReadableEvent::Signal() {
21 if (is_signaled) {
22 return;
23 }
24
25 is_signaled = true;
26 NotifyAvailable();
27}
28
29bool KReadableEvent::IsSignaled() const { 23bool 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
35void KReadableEvent::Clear() { 29ResultCode KReadableEvent::Signal() {
36 is_signaled = false; 30 KScopedSchedulerLock lk{kernel};
37}
38 31
39ResultCode 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
40ResultCode KReadableEvent::Clear() {
41 Reset();
42
43 return RESULT_SUCCESS;
44}
45
46ResultCode 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"
10union ResultCode;
11 10
12namespace Kernel { 11namespace Kernel {
13 12
14class KernelCore; 13class KernelCore;
15class KWritableEvent; 14class KEvent;
16 15
17class KReadableEvent final : public KSynchronizationObject { 16class KReadableEvent final : public KSynchronizationObject {
18 friend class KWritableEvent;
19
20public: 17public:
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
52private: 42 ResultCode Signal();
53 explicit KReadableEvent(KernelCore& kernel); 43 ResultCode Clear();
44 ResultCode Reset();
54 45
46private:
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
133KSynchronizationObject::KSynchronizationObject(KernelCore& kernel) : Object{kernel} {} 133KSynchronizationObject::KSynchronizationObject(KernelCore& kernel) : Object{kernel} {}
134 134
135KSynchronizationObject::KSynchronizationObject(KernelCore& kernel, std::string&& name)
136 : Object{kernel, std::move(name)} {}
137
135KSynchronizationObject::~KSynchronizationObject() = default; 138KSynchronizationObject::~KSynchronizationObject() = default;
136 139
137void KSynchronizationObject::NotifyAvailable(ResultCode result) { 140void 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
34protected: 34protected:
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
13namespace Kernel { 9namespace Kernel {
14 10
15KWritableEvent::KWritableEvent(KernelCore& kernel) : Object{kernel} {} 11KWritableEvent::KWritableEvent(KernelCore& kernel, std::string&& name)
12 : Object{kernel, std::move(name)} {}
16KWritableEvent::~KWritableEvent() = default; 13KWritableEvent::~KWritableEvent() = default;
17 14
18EventPair KWritableEvent::CreateEventPair(KernelCore& kernel, std::string name) { 15void 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
29std::shared_ptr<KReadableEvent> KWritableEvent::GetReadableEvent() const {
30 return readable;
31} 17}
32 18
33void KWritableEvent::Signal() { 19ResultCode KWritableEvent::Signal() {
34 readable->Signal(); 20 return parent->GetReadableEvent()->Signal();
35} 21}
36 22
37void KWritableEvent::Clear() { 23ResultCode 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
11namespace Kernel { 10namespace Kernel {
12 11
13class KernelCore; 12class KernelCore;
14class KReadableEvent; 13class KEvent;
15class KWritableEvent;
16
17struct EventPair {
18 std::shared_ptr<KReadableEvent> readable;
19 std::shared_ptr<KWritableEvent> writable;
20};
21 14
22class KWritableEvent final : public Object { 15class KWritableEvent final : public Object {
23public: 16public:
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
52private: 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) 40private:
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
9namespace Kernel { 9namespace Kernel {
10 10
11Object::Object(KernelCore& kernel) : kernel{kernel}, object_id{kernel.CreateNewObjectID()} {} 11Object::Object(KernelCore& kernel_)
12 : kernel{kernel_}, object_id{kernel_.CreateNewObjectID()}, name{"[UNKNOWN KERNEL OBJECT]"} {}
13Object::Object(KernelCore& kernel_, std::string&& name_)
14 : kernel{kernel_}, object_id{kernel_.CreateNewObjectID()}, name{std::move(name_)} {}
12Object::~Object() = default; 15Object::~Object() = default;
13 16
14bool Object::IsWaitable() const { 17bool 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
19enum class HandleType : u32 { 19enum 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
35class Object : NonCopyable, public std::enable_shared_from_this<Object> { 36class Object : NonCopyable, public std::enable_shared_from_this<Object> {
36public: 37public:
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
70private: 72private:
71 std::atomic<u32> object_id{0}; 73 std::atomic<u32> object_id{0};
74 std::string name;
72}; 75};
73 76
74template <typename T> 77template <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
319ISelfController::~ISelfController() = default; 321ISelfController::~ISelfController() = default;
@@ -372,11 +374,11 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) {
372void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { 374void 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
382void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { 384void 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
561AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) { 563AppletMessageQueue::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
568AppletMessageQueue::~AppletMessageQueue() = default; 571AppletMessageQueue::~AppletMessageQueue() = default;
569 572
570const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const { 573const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const {
571 return on_new_message.readable; 574 return on_new_message->GetReadableEvent();
572} 575}
573 576
574const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() 577const 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
579void AppletMessageQueue::PushMessage(AppletMessage msg) { 582void 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
584AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { 587AppletMessageQueue::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 {
601void AppletMessageQueue::OperationModeChanged() { 604void 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
607void AppletMessageQueue::RequestExit() { 610void 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
1242IApplicationFunctions::~IApplicationFunctions() = default; 1246IApplicationFunctions::~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
1639void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERequestContext& ctx) { 1643void 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
1647void IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( 1651void 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
1663void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, 1667void 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
1700IHomeMenuFunctions::~IHomeMenuFunctions() = default; 1705IHomeMenuFunctions::~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
1717IGlobalStateController::IGlobalStateController(Core::System& system_) 1722IGlobalStateController::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
13namespace Kernel { 13namespace Kernel {
14class KernelCore; 14class KernelCore;
15class KEvent;
15class TransferMemory; 16class TransferMemory;
16} // namespace Kernel 17} // namespace Kernel
17 18
@@ -65,8 +66,8 @@ public:
65 66
66private: 67private:
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
72class IWindowController final : public ServiceFramework<IWindowController> { 73class 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
303class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { 304class 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
315class IGlobalStateController final : public ServiceFramework<IGlobalStateController> { 316class 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
28AppletDataBroker::AppletDataBroker(Kernel::KernelCore& kernel) { 30AppletDataBroker::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
37AppletDataBroker::~AppletDataBroker() = default; 41AppletDataBroker::~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
97void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { 101void 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
102void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { 106void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) {
@@ -105,23 +109,23 @@ void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& s
105 109
106void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { 110void 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
111void AppletDataBroker::SignalStateChanged() const { 115void AppletDataBroker::SignalStateChanged() const {
112 state_changed_event.writable->Signal(); 116 state_changed_event->GetWritableEvent()->Signal();
113} 117}
114 118
115std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetNormalDataEvent() const { 119std::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
119std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { 123std::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
123std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const { 127std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const {
124 return state_changed_event.readable; 128 return state_changed_event->GetReadableEvent();
125} 129}
126 130
127Applet::Applet(Kernel::KernelCore& kernel_) : broker{kernel_} {} 131Applet::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
13union ResultCode; 13union ResultCode;
@@ -29,7 +29,9 @@ class WebBrowserApplet;
29 29
30namespace Kernel { 30namespace Kernel {
31class KernelCore; 31class KernelCore;
32} 32class KEvent;
33class KReadableEvent;
34} // namespace Kernel
33 35
34namespace Service::AM { 36namespace 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
118class Applet { 120class 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
69private: 71private:
@@ -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
105AOC_U::AOC_U(Core::System& system_) 107AOC_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
131AOC_U::~AOC_U() = default; 133AOC_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
258void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { 260void 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
13namespace Kernel { 13namespace Kernel {
14class KWritableEvent; 14class KEvent;
15} 15}
16 16
17namespace Service::AOC { 17namespace 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
203private: 206private:
@@ -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
13ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel, 16ProgressServiceBackend::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
19std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { 23std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const {
20 return event.readable; 24 return event->GetReadableEvent();
21} 25}
22 26
23DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() { 27DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() {
@@ -85,9 +89,9 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) {
85void ProgressServiceBackend::SignalUpdate() const { 89void 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
18namespace Core { 16namespace Core {
@@ -21,7 +19,9 @@ class System;
21 19
22namespace Kernel { 20namespace Kernel {
23class KernelCore; 21class KernelCore;
24} 22class KEvent;
23class KReadableEvent;
24} // namespace Kernel
25 25
26namespace Service::BCAT { 26namespace 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
41private: 42private:
@@ -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
53class BtDrv final : public ServiceFramework<BtDrv> { 54class 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
69private: 71private:
@@ -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
108class BTM_USR final : public ServiceFramework<BTM_USR> { 110class 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
190private: 192private:
@@ -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) {
233void Controller_NPad::OnInit() { 234void 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
875std::shared_ptr<Kernel::KReadableEvent> Controller_NPad::GetStyleSetChangedEvent( 877std::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
881void Controller_NPad::SignalStyleSetChangedEvent(u32 npad_id) const { 883void 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
885void Controller_NPad::AddNewControllerAt(NPadControllerType controller, std::size_t npad_index) { 887void 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
16namespace Kernel {
17class KEvent;
18class KReadableEvent;
19} // namespace Kernel
20
17namespace Service::HID { 21namespace Service::HID {
18 22
19constexpr u32 NPAD_HANDHELD = 32; 23constexpr 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
31Module::Interface::~Interface() = default; 33Module::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
72private: 75private:
@@ -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
343const std::shared_ptr<Kernel::KReadableEvent>& Module::Interface::GetNFCEvent() const { 346const 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
347const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { 350const 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
12namespace Kernel {
13class KEvent;
14}
15
13namespace Service::NFP { 16namespace Service::NFP {
14 17
15class Module final { 18class 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
165private: 168private:
@@ -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
232class INetworkProfile final : public ServiceFramework<INetworkProfile> { 235class 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
308private: 310private:
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(), &params, sizeof(params)); 115 std::memcpy(output.data(), &params, 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(), &params, sizeof(params)); 142 std::memcpy(output.data(), &params, 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
174std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { 176std::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
178std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { 180std::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 {
17class System; 17class System;
18} 18}
19 19
20namespace Kernel {
21class KEvent;
22}
23
20namespace Service::NVFlinger { 24namespace Service::NVFlinger {
21class NVFlinger; 25class NVFlinger;
22} 26}
@@ -31,7 +35,7 @@ class nvdevice;
31 35
32/// Represents an Nvidia event 36/// Represents an Nvidia event
33struct NvEvent { 37struct 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
17BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id, u64 layer_id) 17BufferQueue::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
22BufferQueue::~BufferQueue() = default; 23BufferQueue::~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
47std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width, 48std::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
125std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { 126std::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
160void BufferQueue::Connect() { 161void 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
191std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const { 192std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent() const {
192 return buffer_wait_event.writable; 193 return buffer_wait_event->GetWritableEvent();
193} 194}
194 195
195std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { 196std::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
20namespace Kernel { 19namespace Kernel {
21class KernelCore; 20class KernelCore;
22} 21class KEvent;
22class KReadableEvent;
23class KWritableEvent;
24} // namespace Kernel
23 25
24namespace Service::NVFlinger { 26namespace 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
118class PSM final : public ServiceFramework<PSM> { 120class 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
24ResultCode StandardUserSystemClockCore::SetAutomaticCorrectionEnabled(Core::System& system, 26ResultCode 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 {
12class System; 11class System;
13} 12}
14 13
14namespace Kernel {
15class KEvent;
16}
17
15namespace Service::Time::Clock { 18namespace Service::Time::Clock {
16 19
17class StandardLocalSystemClockCore; 20class 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
18Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{std::move(name)} { 20Display::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
24Display::~Display() = default; 26Display::~Display() = default;
@@ -32,11 +34,11 @@ const Layer& Display::GetLayer(std::size_t index) const {
32} 34}
33 35
34std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { 36std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const {
35 return vsync_event.readable; 37 return vsync_event->GetReadableEvent();
36} 38}
37 39
38void Display::SignalVSyncEvent() { 40void Display::SignalVSyncEvent() {
39 vsync_event.writable->Signal(); 41 vsync_event->GetWritableEvent()->Signal();
40} 42}
41 43
42void Display::CreateLayer(u64 id, NVFlinger::BufferQueue& buffer_queue) { 44void 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
13namespace Kernel {
14class KEvent;
15}
13 16
14namespace Service::NVFlinger { 17namespace Service::NVFlinger {
15class BufferQueue; 18class 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