diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.h | 7 |
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 { | |||
| 62 | public: | 62 | public: |
| 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 | ||
| 38 | void HLERequestContext::ClearIncomingObjects() { | ||
| 39 | request_handles.clear(); | ||
| 40 | } | ||
| 41 | |||
| 38 | ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf, | 42 | ResultCode 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 | |||
| 113 | private: | 120 | private: |
| 114 | friend class Service::ServiceFrameworkBase; | 121 | friend class Service::ServiceFrameworkBase; |
| 115 | 122 | ||