summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/ipc_helpers.h3
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp4
-rw-r--r--src/core/hle/kernel/hle_ipc.h7
3 files changed, 14 insertions, 0 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index 5f370bc3b..f0d89cffe 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -62,6 +62,9 @@ class RequestBuilder : public RequestHelperBase {
62public: 62public:
63 RequestBuilder(Kernel::HLERequestContext& context, Header command_header) 63 RequestBuilder(Kernel::HLERequestContext& context, Header command_header)
64 : RequestHelperBase(context, command_header) { 64 : RequestHelperBase(context, command_header) {
65 // From this point we will start overwriting the existing command buffer, so it's safe to
66 // release all previous incoming Object pointers since they won't be usable anymore.
67 context.ClearIncomingObjects();
65 cmdbuf[0] = header.raw; 68 cmdbuf[0] = header.raw;
66 } 69 }
67 70
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 656405dd6..6cf1886cf 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -35,6 +35,10 @@ u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) {
35 return request_handles.size() - 1; 35 return request_handles.size() - 1;
36} 36}
37 37
38void HLERequestContext::ClearIncomingObjects() {
39 request_handles.clear();
40}
41
38ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf, 42ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf,
39 Process& src_process, 43 Process& src_process,
40 HandleTable& src_table) { 44 HandleTable& src_table) {
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index d6ebf113c..1022dece8 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -110,6 +110,13 @@ public:
110 */ 110 */
111 u32 AddOutgoingHandle(SharedPtr<Object> object); 111 u32 AddOutgoingHandle(SharedPtr<Object> object);
112 112
113 /**
114 * Discards all Objects from the context, invalidating all ids. This may be called after reading
115 * out all incoming objects, so that the buffer memory can be re-used for outgoing handles, but
116 * this is not required.
117 */
118 void ClearIncomingObjects();
119
113private: 120private:
114 friend class Service::ServiceFrameworkBase; 121 friend class Service::ServiceFrameworkBase;
115 122