summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar bunnei2021-04-03 21:21:22 -0700
committerGravatar bunnei2021-05-05 16:40:50 -0700
commit5e5933256b022f6890fc3f14164ae9e9c3ee9ae3 (patch)
treef65bdacde0afe5465446f90e26f2da1b8126cda9 /src/core
parenthle: kernel: Migrate more of KThread to KAutoObject. (diff)
downloadyuzu-5e5933256b022f6890fc3f14164ae9e9c3ee9ae3.tar.gz
yuzu-5e5933256b022f6890fc3f14164ae9e9c3ee9ae3.tar.xz
yuzu-5e5933256b022f6890fc3f14164ae9e9c3ee9ae3.zip
hle: kernel: Refactor IPC interfaces to not use std::shared_ptr.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/ipc_helpers.h20
-rw-r--r--src/core/hle/kernel/client_port.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp12
-rw-r--r--src/core/hle/kernel/hle_ipc.h19
-rw-r--r--src/core/hle/kernel/k_event.h4
-rw-r--r--src/core/hle/kernel/svc.cpp2
-rw-r--r--src/core/hle/service/am/am.cpp5
-rw-r--r--src/core/hle/service/am/am.h4
-rw-r--r--src/core/hle/service/am/applets/applets.cpp6
-rw-r--r--src/core/hle/service/am/applets/applets.h6
-rw-r--r--src/core/hle/service/bcat/backend/backend.cpp2
-rw-r--r--src/core/hle/service/bcat/module.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp3
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/hid/hid.cpp2
-rw-r--r--src/core/hle/service/hid/irs.cpp2
-rw-r--r--src/core/hle/service/nfp/nfp.cpp2
-rw-r--r--src/core/hle/service/nfp/nfp.h2
-rw-r--r--src/core/hle/service/ns/pl_u.cpp2
-rw-r--r--src/core/hle/service/nvdrv/interface.cpp2
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp2
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp2
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h1
-rw-r--r--src/core/hle/service/sm/controller.cpp2
-rw-r--r--src/core/hle/service/sm/sm.cpp8
-rw-r--r--src/core/hle/service/time/time.cpp2
-rw-r--r--src/core/hle/service/vi/display/vi_display.cpp2
-rw-r--r--src/core/hle/service/vi/vi.cpp4
28 files changed, 65 insertions, 59 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index 56cc911d1..224bee950 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -138,8 +138,8 @@ public:
138 context->AddDomainObject(std::move(iface)); 138 context->AddDomainObject(std::move(iface));
139 } else { 139 } else {
140 auto [client, server] = Kernel::Session::Create(kernel, iface->GetServiceName()); 140 auto [client, server] = Kernel::Session::Create(kernel, iface->GetServiceName());
141 context->AddMoveObject(std::move(client)); 141 context->AddMoveObject(client.get());
142 iface->ClientConnected(std::move(server)); 142 iface->ClientConnected(std::move(client), std::move(server));
143 } 143 }
144 } 144 }
145 145
@@ -215,10 +215,10 @@ public:
215 void PushRaw(const T& value); 215 void PushRaw(const T& value);
216 216
217 template <typename... O> 217 template <typename... O>
218 void PushMoveObjects(std::shared_ptr<O>... pointers); 218 void PushMoveObjects(O*... pointers);
219 219
220 template <typename... O> 220 template <typename... O>
221 void PushCopyObjects(std::shared_ptr<O>... pointers); 221 void PushCopyObjects(O*... pointers);
222 222
223private: 223private:
224 u32 normal_params_size{}; 224 u32 normal_params_size{};
@@ -301,7 +301,7 @@ void ResponseBuilder::Push(const First& first_value, const Other&... other_value
301} 301}
302 302
303template <typename... O> 303template <typename... O>
304inline void ResponseBuilder::PushCopyObjects(std::shared_ptr<O>... pointers) { 304inline void ResponseBuilder::PushCopyObjects(O*... pointers) {
305 auto objects = {pointers...}; 305 auto objects = {pointers...};
306 for (auto& object : objects) { 306 for (auto& object : objects) {
307 context->AddCopyObject(std::move(object)); 307 context->AddCopyObject(std::move(object));
@@ -309,7 +309,7 @@ inline void ResponseBuilder::PushCopyObjects(std::shared_ptr<O>... pointers) {
309} 309}
310 310
311template <typename... O> 311template <typename... O>
312inline void ResponseBuilder::PushMoveObjects(std::shared_ptr<O>... pointers) { 312inline void ResponseBuilder::PushMoveObjects(O*... pointers) {
313 auto objects = {pointers...}; 313 auto objects = {pointers...};
314 for (auto& object : objects) { 314 for (auto& object : objects) {
315 context->AddMoveObject(std::move(object)); 315 context->AddMoveObject(std::move(object));
@@ -360,10 +360,10 @@ public:
360 T PopRaw(); 360 T PopRaw();
361 361
362 template <typename T> 362 template <typename T>
363 std::shared_ptr<T> GetMoveObject(std::size_t index); 363 T* GetMoveObject(std::size_t index);
364 364
365 template <typename T> 365 template <typename T>
366 std::shared_ptr<T> GetCopyObject(std::size_t index); 366 T* GetCopyObject(std::size_t index);
367 367
368 template <class T> 368 template <class T>
369 std::shared_ptr<T> PopIpcInterface() { 369 std::shared_ptr<T> PopIpcInterface() {
@@ -470,12 +470,12 @@ void RequestParser::Pop(First& first_value, Other&... other_values) {
470} 470}
471 471
472template <typename T> 472template <typename T>
473std::shared_ptr<T> RequestParser::GetMoveObject(std::size_t index) { 473T* RequestParser::GetMoveObject(std::size_t index) {
474 return context->GetMoveObject<T>(index); 474 return context->GetMoveObject<T>(index);
475} 475}
476 476
477template <typename T> 477template <typename T>
478std::shared_ptr<T> RequestParser::GetCopyObject(std::size_t index) { 478T* RequestParser::GetCopyObject(std::size_t index) {
479 return context->GetCopyObject<T>(index); 479 return context->GetCopyObject<T>(index);
480} 480}
481 481
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 0b6957e31..431a90d82 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -28,7 +28,7 @@ ResultVal<std::shared_ptr<ClientSession>> ClientPort::Connect() {
28 auto [client, server] = Kernel::Session::Create(kernel, name); 28 auto [client, server] = Kernel::Session::Create(kernel, name);
29 29
30 if (server_port->HasHLEHandler()) { 30 if (server_port->HasHLEHandler()) {
31 server_port->GetHLEHandler()->ClientConnected(std::move(server)); 31 server_port->GetHLEHandler()->ClientConnected(client, std::move(server));
32 } else { 32 } else {
33 server_port->AppendPendingSession(std::move(server)); 33 server_port->AppendPendingSession(std::move(server));
34 } 34 }
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 6ffe6ac41..a9702539f 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -35,15 +35,17 @@ SessionRequestHandler::SessionRequestHandler() = default;
35 35
36SessionRequestHandler::~SessionRequestHandler() = default; 36SessionRequestHandler::~SessionRequestHandler() = default;
37 37
38void SessionRequestHandler::ClientConnected(std::shared_ptr<ServerSession> server_session) { 38void SessionRequestHandler::ClientConnected(std::shared_ptr<ClientSession> client_session,
39 std::shared_ptr<ServerSession> server_session) {
39 server_session->SetHleHandler(shared_from_this()); 40 server_session->SetHleHandler(shared_from_this());
40 connected_sessions.push_back(std::move(server_session)); 41 client_sessions.push_back(std::move(client_session));
42 server_sessions.push_back(std::move(server_session));
41} 43}
42 44
43void SessionRequestHandler::ClientDisconnected( 45void SessionRequestHandler::ClientDisconnected(
44 const std::shared_ptr<ServerSession>& server_session) { 46 const std::shared_ptr<ServerSession>& server_session) {
45 server_session->SetHleHandler(nullptr); 47 server_session->SetHleHandler(nullptr);
46 boost::range::remove_erase(connected_sessions, server_session); 48 boost::range::remove_erase(server_sessions, server_session);
47} 49}
48 50
49HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_, 51HLERequestContext::HLERequestContext(KernelCore& kernel_, Core::Memory::Memory& memory_,
@@ -223,12 +225,12 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(KThread& thread) {
223 // for specific values in each of these descriptors. 225 // for specific values in each of these descriptors.
224 for (auto& object : copy_objects) { 226 for (auto& object : copy_objects) {
225 ASSERT(object != nullptr); 227 ASSERT(object != nullptr);
226 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap(); 228 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap();
227 } 229 }
228 230
229 for (auto& object : move_objects) { 231 for (auto& object : move_objects) {
230 ASSERT(object != nullptr); 232 ASSERT(object != nullptr);
231 dst_cmdbuf[current_offset++] = handle_table.Create(object).Unwrap(); 233 dst_cmdbuf[current_offset++] = handle_table.Create(SharedFrom(object)).Unwrap();
232 } 234 }
233 } 235 }
234 236
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index 398f1c467..74a95bc76 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -39,6 +39,7 @@ class HandleTable;
39class HLERequestContext; 39class HLERequestContext;
40class KernelCore; 40class KernelCore;
41class Process; 41class Process;
42class ClientSession;
42class ServerSession; 43class ServerSession;
43class KThread; 44class KThread;
44class KReadableEvent; 45class KReadableEvent;
@@ -71,7 +72,8 @@ public:
71 * associated ServerSession alive for the duration of the connection. 72 * associated ServerSession alive for the duration of the connection.
72 * @param server_session Owning pointer to the ServerSession associated with the connection. 73 * @param server_session Owning pointer to the ServerSession associated with the connection.
73 */ 74 */
74 void ClientConnected(std::shared_ptr<ServerSession> server_session); 75 void ClientConnected(
76 std::shared_ptr<ClientSession> client_session, std::shared_ptr<ServerSession> server_session);
75 77
76 /** 78 /**
77 * Signals that a client has just disconnected from this HLE handler and releases the 79 * Signals that a client has just disconnected from this HLE handler and releases the
@@ -84,7 +86,8 @@ protected:
84 /// List of sessions that are connected to this handler. 86 /// List of sessions that are connected to this handler.
85 /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list 87 /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list
86 /// for the duration of the connection. 88 /// for the duration of the connection.
87 std::vector<std::shared_ptr<ServerSession>> connected_sessions; 89 std::vector<std::shared_ptr<ClientSession>> client_sessions;
90 std::vector<std::shared_ptr<ServerSession>> server_sessions;
88}; 91};
89 92
90/** 93/**
@@ -218,21 +221,21 @@ public:
218 } 221 }
219 222
220 template <typename T> 223 template <typename T>
221 std::shared_ptr<T> GetCopyObject(std::size_t index) { 224 T* GetCopyObject(std::size_t index) {
222 return DynamicObjectCast<T>(copy_objects.at(index)); 225 return DynamicObjectCast<T>(copy_objects.at(index));
223 } 226 }
224 227
225 template <typename T> 228 template <typename T>
226 std::shared_ptr<T> GetMoveObject(std::size_t index) { 229 T* GetMoveObject(std::size_t index) {
227 return DynamicObjectCast<T>(move_objects.at(index)); 230 return DynamicObjectCast<T>(move_objects.at(index));
228 } 231 }
229 232
230 void AddMoveObject(std::shared_ptr<Object> object) { 233 void AddMoveObject(Object* object) {
231 move_objects.emplace_back(std::move(object)); 234 move_objects.emplace_back(object);
232 } 235 }
233 236
234 void AddCopyObject(std::shared_ptr<Object> object) { 237 void AddCopyObject(Object* object) {
235 copy_objects.emplace_back(std::move(object)); 238 copy_objects.emplace_back(object);
236 } 239 }
237 240
238 void AddDomainObject(std::shared_ptr<SessionRequestHandler> object) { 241 void AddDomainObject(std::shared_ptr<SessionRequestHandler> object) {
diff --git a/src/core/hle/kernel/k_event.h b/src/core/hle/kernel/k_event.h
index 2fb887129..ec6894b16 100644
--- a/src/core/hle/kernel/k_event.h
+++ b/src/core/hle/kernel/k_event.h
@@ -32,8 +32,8 @@ public:
32 return HANDLE_TYPE; 32 return HANDLE_TYPE;
33 } 33 }
34 34
35 std::shared_ptr<KReadableEvent>& GetReadableEvent() { 35 KReadableEvent* GetReadableEvent() {
36 return readable_event; 36 return readable_event.get();
37 } 37 }
38 38
39 std::shared_ptr<KWritableEvent>& GetWritableEvent() { 39 std::shared_ptr<KWritableEvent>& GetWritableEvent() {
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 813450115..dca1bcc92 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -1976,7 +1976,7 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o
1976 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); }); 1976 auto handle_guard = SCOPE_GUARD({ handle_table.Remove(*write_create_result); });
1977 1977
1978 // Add the readable event to the handle table. 1978 // Add the readable event to the handle table.
1979 const auto read_create_result = handle_table.Create(event->GetReadableEvent()); 1979 const auto read_create_result = handle_table.Create(SharedFrom(event->GetReadableEvent()));
1980 if (read_create_result.Failed()) { 1980 if (read_create_result.Failed()) {
1981 return read_create_result.Code(); 1981 return read_create_result.Code();
1982 } 1982 }
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 58c7f2930..7be94446a 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -588,12 +588,11 @@ AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) {
588 588
589AppletMessageQueue::~AppletMessageQueue() = default; 589AppletMessageQueue::~AppletMessageQueue() = default;
590 590
591const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const { 591Kernel::KReadableEvent* AppletMessageQueue::GetMessageReceiveEvent() const {
592 return on_new_message->GetReadableEvent(); 592 return on_new_message->GetReadableEvent();
593} 593}
594 594
595const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() 595Kernel::KReadableEvent* AppletMessageQueue::GetOperationModeChangedEvent() const {
596 const {
597 return on_operation_mode_changed->GetReadableEvent(); 596 return on_operation_mode_changed->GetReadableEvent();
598} 597}
599 598
diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h
index 5d302e155..f8daeb437 100644
--- a/src/core/hle/service/am/am.h
+++ b/src/core/hle/service/am/am.h
@@ -56,8 +56,8 @@ public:
56 explicit AppletMessageQueue(Kernel::KernelCore& kernel); 56 explicit AppletMessageQueue(Kernel::KernelCore& kernel);
57 ~AppletMessageQueue(); 57 ~AppletMessageQueue();
58 58
59 const std::shared_ptr<Kernel::KReadableEvent>& GetMessageReceiveEvent() const; 59 Kernel::KReadableEvent* GetMessageReceiveEvent() const;
60 const std::shared_ptr<Kernel::KReadableEvent>& GetOperationModeChangedEvent() const; 60 Kernel::KReadableEvent* GetOperationModeChangedEvent() const;
61 void PushMessage(AppletMessage msg); 61 void PushMessage(AppletMessage msg);
62 AppletMessage PopMessage(); 62 AppletMessage PopMessage();
63 std::size_t GetMessageCount() const; 63 std::size_t GetMessageCount() const;
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index a56df6a7e..c093813fe 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -142,15 +142,15 @@ void AppletDataBroker::SignalStateChanged() const {
142 } 142 }
143} 143}
144 144
145std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetNormalDataEvent() const { 145Kernel::KReadableEvent* AppletDataBroker::GetNormalDataEvent() const {
146 return pop_out_data_event->GetReadableEvent(); 146 return pop_out_data_event->GetReadableEvent();
147} 147}
148 148
149std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { 149Kernel::KReadableEvent* AppletDataBroker::GetInteractiveDataEvent() const {
150 return pop_interactive_out_data_event->GetReadableEvent(); 150 return pop_interactive_out_data_event->GetReadableEvent();
151} 151}
152 152
153std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const { 153Kernel::KReadableEvent* AppletDataBroker::GetStateChangedEvent() const {
154 return state_changed_event->GetReadableEvent(); 154 return state_changed_event->GetReadableEvent();
155} 155}
156 156
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h
index 4215d2232..ffde8ced0 100644
--- a/src/core/hle/service/am/applets/applets.h
+++ b/src/core/hle/service/am/applets/applets.h
@@ -97,9 +97,9 @@ public:
97 97
98 void SignalStateChanged() const; 98 void SignalStateChanged() const;
99 99
100 std::shared_ptr<Kernel::KReadableEvent> GetNormalDataEvent() const; 100 Kernel::KReadableEvent* GetNormalDataEvent() const;
101 std::shared_ptr<Kernel::KReadableEvent> GetInteractiveDataEvent() const; 101 Kernel::KReadableEvent* GetInteractiveDataEvent() const;
102 std::shared_ptr<Kernel::KReadableEvent> GetStateChangedEvent() const; 102 Kernel::KReadableEvent* GetStateChangedEvent() const;
103 103
104private: 104private:
105 Core::System& system; 105 Core::System& system;
diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp
index 92d25dbe4..7f301fdeb 100644
--- a/src/core/hle/service/bcat/backend/backend.cpp
+++ b/src/core/hle/service/bcat/backend/backend.cpp
@@ -21,7 +21,7 @@ ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel,
21} 21}
22 22
23std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const { 23std::shared_ptr<Kernel::KReadableEvent> ProgressServiceBackend::GetEvent() const {
24 return event->GetReadableEvent(); 24 return SharedFrom(event->GetReadableEvent());
25} 25}
26 26
27DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() { 27DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() {
diff --git a/src/core/hle/service/bcat/module.cpp b/src/core/hle/service/bcat/module.cpp
index 285085f2a..8473b716b 100644
--- a/src/core/hle/service/bcat/module.cpp
+++ b/src/core/hle/service/bcat/module.cpp
@@ -109,7 +109,7 @@ private:
109 109
110 IPC::ResponseBuilder rb{ctx, 2, 1}; 110 IPC::ResponseBuilder rb{ctx, 2, 1};
111 rb.Push(RESULT_SUCCESS); 111 rb.Push(RESULT_SUCCESS);
112 rb.PushCopyObjects(event); 112 rb.PushCopyObjects(event.get());
113 } 113 }
114 114
115 void GetImpl(Kernel::HLERequestContext& ctx) { 115 void GetImpl(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index d4678ef49..9d07ca09c 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -955,8 +955,7 @@ bool Controller_NPad::IsVibrationDeviceMounted(const DeviceHandle& vibration_dev
955 return vibration_devices_mounted[npad_index][device_index]; 955 return vibration_devices_mounted[npad_index][device_index];
956} 956}
957 957
958std::shared_ptr<Kernel::KReadableEvent> Controller_NPad::GetStyleSetChangedEvent( 958Kernel::KReadableEvent* Controller_NPad::GetStyleSetChangedEvent(u32 npad_id) const {
959 u32 npad_id) const {
960 const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; 959 const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)];
961 return styleset_event->GetReadableEvent(); 960 return styleset_event->GetReadableEvent();
962} 961}
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index ea484d4bf..8c24728b1 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -199,7 +199,7 @@ public:
199 199
200 bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const; 200 bool IsVibrationDeviceMounted(const DeviceHandle& vibration_device_handle) const;
201 201
202 std::shared_ptr<Kernel::KReadableEvent> GetStyleSetChangedEvent(u32 npad_id) const; 202 Kernel::KReadableEvent* GetStyleSetChangedEvent(u32 npad_id) const;
203 void SignalStyleSetChangedEvent(u32 npad_id) const; 203 void SignalStyleSetChangedEvent(u32 npad_id) const;
204 204
205 // Adds a new controller at an index. 205 // Adds a new controller at an index.
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 9c4bf6d16..d2a6375f5 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -118,7 +118,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
118 118
119 IPC::ResponseBuilder rb{ctx, 2, 1}; 119 IPC::ResponseBuilder rb{ctx, 2, 1};
120 rb.Push(RESULT_SUCCESS); 120 rb.Push(RESULT_SUCCESS);
121 rb.PushCopyObjects(shared_mem); 121 rb.PushCopyObjects(shared_mem.get());
122} 122}
123 123
124void IAppletResource::UpdateControllers(std::uintptr_t user_data, 124void IAppletResource::UpdateControllers(std::uintptr_t user_data,
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index 2dfa936fb..b50a51eb7 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -62,7 +62,7 @@ void IRS::GetIrsensorSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
62 62
63 IPC::ResponseBuilder rb{ctx, 2, 1}; 63 IPC::ResponseBuilder rb{ctx, 2, 1};
64 rb.Push(RESULT_SUCCESS); 64 rb.Push(RESULT_SUCCESS);
65 rb.PushCopyObjects(shared_mem); 65 rb.PushCopyObjects(shared_mem.get());
66} 66}
67 67
68void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) { 68void IRS::StopImageProcessor(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index 2d1d4d67f..1446c0bcf 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -343,7 +343,7 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
343 return true; 343 return true;
344} 344}
345 345
346const std::shared_ptr<Kernel::KReadableEvent>& Module::Interface::GetNFCEvent() const { 346Kernel::KReadableEvent* Module::Interface::GetNFCEvent() const {
347 return nfc_tag_load->GetReadableEvent(); 347 return nfc_tag_load->GetReadableEvent();
348} 348}
349 349
diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h
index c46551760..7a97caffb 100644
--- a/src/core/hle/service/nfp/nfp.h
+++ b/src/core/hle/service/nfp/nfp.h
@@ -38,7 +38,7 @@ public:
38 38
39 void CreateUserInterface(Kernel::HLERequestContext& ctx); 39 void CreateUserInterface(Kernel::HLERequestContext& ctx);
40 bool LoadAmiibo(const std::vector<u8>& buffer); 40 bool LoadAmiibo(const std::vector<u8>& buffer);
41 const std::shared_ptr<Kernel::KReadableEvent>& GetNFCEvent() const; 41 Kernel::KReadableEvent* GetNFCEvent() const;
42 const AmiiboFile& GetAmiiboBuffer() const; 42 const AmiiboFile& GetAmiiboBuffer() const;
43 43
44 private: 44 private:
diff --git a/src/core/hle/service/ns/pl_u.cpp b/src/core/hle/service/ns/pl_u.cpp
index da139fdc4..e6616a3b9 100644
--- a/src/core/hle/service/ns/pl_u.cpp
+++ b/src/core/hle/service/ns/pl_u.cpp
@@ -267,7 +267,7 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) {
267 267
268 IPC::ResponseBuilder rb{ctx, 2, 1}; 268 IPC::ResponseBuilder rb{ctx, 2, 1};
269 rb.Push(RESULT_SUCCESS); 269 rb.Push(RESULT_SUCCESS);
270 rb.PushCopyObjects(impl->shared_font_mem); 270 rb.PushCopyObjects(impl->shared_font_mem.get());
271} 271}
272 272
273void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) { 273void PL_U::GetSharedFontInOrderOfPriority(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp
index eff9c3cc9..8e359040f 100644
--- a/src/core/hle/service/nvdrv/interface.cpp
+++ b/src/core/hle/service/nvdrv/interface.cpp
@@ -189,7 +189,7 @@ void NVDRV::QueryEvent(Kernel::HLERequestContext& ctx) {
189 rb.Push(RESULT_SUCCESS); 189 rb.Push(RESULT_SUCCESS);
190 auto event = nvdrv->GetEvent(event_id); 190 auto event = nvdrv->GetEvent(event_id);
191 event->Clear(); 191 event->Clear();
192 rb.PushCopyObjects(event); 192 rb.PushCopyObjects(event.get());
193 rb.PushEnum(NvResult::Success); 193 rb.PushEnum(NvResult::Success);
194 } else { 194 } else {
195 IPC::ResponseBuilder rb{ctx, 3}; 195 IPC::ResponseBuilder rb{ctx, 3};
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp
index ede77858a..6bba9c0b3 100644
--- a/src/core/hle/service/nvdrv/nvdrv.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv.cpp
@@ -178,7 +178,7 @@ void Module::SignalSyncpt(const u32 syncpoint_id, const u32 value) {
178} 178}
179 179
180std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const { 180std::shared_ptr<Kernel::KReadableEvent> Module::GetEvent(const u32 event_id) const {
181 return events_interface.events[event_id].event->GetReadableEvent(); 181 return SharedFrom(events_interface.events[event_id].event->GetReadableEvent());
182} 182}
183 183
184std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const { 184std::shared_ptr<Kernel::KWritableEvent> Module::GetEventWriteable(const u32 event_id) const {
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp
index 7842a82ed..f783ae54f 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue.cpp
@@ -194,7 +194,7 @@ std::shared_ptr<Kernel::KWritableEvent> BufferQueue::GetWritableBufferWaitEvent(
194} 194}
195 195
196std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const { 196std::shared_ptr<Kernel::KReadableEvent> BufferQueue::GetBufferWaitEvent() const {
197 return buffer_wait_event->GetReadableEvent(); 197 return SharedFrom(buffer_wait_event->GetReadableEvent());
198} 198}
199 199
200} // 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 163fa4c54..9a21c7426 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -13,6 +13,7 @@
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_readable_event.h"
16#include "core/hle/kernel/object.h" 17#include "core/hle/kernel/object.h"
17#include "core/hle/service/nvdrv/nvdata.h" 18#include "core/hle/service/nvdrv/nvdata.h"
18 19
diff --git a/src/core/hle/service/sm/controller.cpp b/src/core/hle/service/sm/controller.cpp
index 916177efd..b34fe4bc2 100644
--- a/src/core/hle/service/sm/controller.cpp
+++ b/src/core/hle/service/sm/controller.cpp
@@ -30,7 +30,7 @@ void Controller::CloneCurrentObject(Kernel::HLERequestContext& ctx) {
30 30
31 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; 31 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
32 rb.Push(RESULT_SUCCESS); 32 rb.Push(RESULT_SUCCESS);
33 rb.PushMoveObjects(ctx.Session()->GetParent()->Client()); 33 rb.PushMoveObjects(ctx.Session()->GetParent()->Client().get());
34} 34}
35 35
36void Controller::CloneCurrentObjectEx(Kernel::HLERequestContext& ctx) { 36void Controller::CloneCurrentObjectEx(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index 94608d529..62f7a5358 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -134,7 +134,7 @@ void SM::GetService(Kernel::HLERequestContext& ctx) {
134 134
135 const auto& server_port = client_port.Unwrap()->GetServerPort(); 135 const auto& server_port = client_port.Unwrap()->GetServerPort();
136 if (server_port->GetHLEHandler()) { 136 if (server_port->GetHLEHandler()) {
137 server_port->GetHLEHandler()->ClientConnected(server); 137 server_port->GetHLEHandler()->ClientConnected(client, server);
138 } else { 138 } else {
139 server_port->AppendPendingSession(server); 139 server_port->AppendPendingSession(server);
140 } 140 }
@@ -142,7 +142,7 @@ void SM::GetService(Kernel::HLERequestContext& ctx) {
142 LOG_DEBUG(Service_SM, "called service={} -> session={}", name, client->GetObjectId()); 142 LOG_DEBUG(Service_SM, "called service={} -> session={}", name, client->GetObjectId());
143 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; 143 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
144 rb.Push(RESULT_SUCCESS); 144 rb.Push(RESULT_SUCCESS);
145 rb.PushMoveObjects(std::move(client)); 145 rb.PushMoveObjects(client.get());
146} 146}
147 147
148void SM::RegisterService(Kernel::HLERequestContext& ctx) { 148void SM::RegisterService(Kernel::HLERequestContext& ctx) {
@@ -170,7 +170,9 @@ void SM::RegisterService(Kernel::HLERequestContext& ctx) {
170 170
171 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; 171 IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
172 rb.Push(handle.Code()); 172 rb.Push(handle.Code());
173 rb.PushMoveObjects(std::move(handle).Unwrap()); 173
174 auto server_port = handle.Unwrap();
175 rb.PushMoveObjects(server_port.get());
174} 176}
175 177
176void SM::UnregisterService(Kernel::HLERequestContext& ctx) { 178void SM::UnregisterService(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp
index 32f372d71..30283f239 100644
--- a/src/core/hle/service/time/time.cpp
+++ b/src/core/hle/service/time/time.cpp
@@ -393,7 +393,7 @@ void Module::Interface::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& c
393 LOG_DEBUG(Service_Time, "called"); 393 LOG_DEBUG(Service_Time, "called");
394 IPC::ResponseBuilder rb{ctx, 2, 1}; 394 IPC::ResponseBuilder rb{ctx, 2, 1};
395 rb.Push(RESULT_SUCCESS); 395 rb.Push(RESULT_SUCCESS);
396 rb.PushCopyObjects(SharedFrom(&system.Kernel().GetTimeSharedMem())); 396 rb.PushCopyObjects(&system.Kernel().GetTimeSharedMem());
397} 397}
398 398
399Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_, 399Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_,
diff --git a/src/core/hle/service/vi/display/vi_display.cpp b/src/core/hle/service/vi/display/vi_display.cpp
index ac9e87338..9ffa71352 100644
--- a/src/core/hle/service/vi/display/vi_display.cpp
+++ b/src/core/hle/service/vi/display/vi_display.cpp
@@ -34,7 +34,7 @@ const Layer& Display::GetLayer(std::size_t index) const {
34} 34}
35 35
36std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const { 36std::shared_ptr<Kernel::KReadableEvent> Display::GetVSyncEvent() const {
37 return vsync_event->GetReadableEvent(); 37 return SharedFrom(vsync_event->GetReadableEvent());
38} 38}
39 39
40void Display::SignalVSyncEvent() { 40void Display::SignalVSyncEvent() {
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 7ae07d072..6e507bfb8 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -674,7 +674,7 @@ private:
674 // TODO(Subv): Find out what this actually is. 674 // TODO(Subv): Find out what this actually is.
675 IPC::ResponseBuilder rb{ctx, 2, 1}; 675 IPC::ResponseBuilder rb{ctx, 2, 1};
676 rb.Push(RESULT_SUCCESS); 676 rb.Push(RESULT_SUCCESS);
677 rb.PushCopyObjects(buffer_queue.GetBufferWaitEvent()); 677 rb.PushCopyObjects(buffer_queue.GetBufferWaitEvent().get());
678 } 678 }
679 679
680 NVFlinger::NVFlinger& nv_flinger; 680 NVFlinger::NVFlinger& nv_flinger;
@@ -1209,7 +1209,7 @@ private:
1209 1209
1210 IPC::ResponseBuilder rb{ctx, 2, 1}; 1210 IPC::ResponseBuilder rb{ctx, 2, 1};
1211 rb.Push(RESULT_SUCCESS); 1211 rb.Push(RESULT_SUCCESS);
1212 rb.PushCopyObjects(vsync_event); 1212 rb.PushCopyObjects(vsync_event.get());
1213 } 1213 }
1214 1214
1215 void ConvertScalingMode(Kernel::HLERequestContext& ctx) { 1215 void ConvertScalingMode(Kernel::HLERequestContext& ctx) {