diff options
Diffstat (limited to 'src/core/hle')
| -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 {  public:      RequestBuilder(Kernel::HLERequestContext& context, Header command_header)          : RequestHelperBase(context, command_header) { +        // From this point we will start overwriting the existing command buffer, so it's safe to +        // release all previous incoming Object pointers since they won't be usable anymore. +        context.ClearIncomingObjects();          cmdbuf[0] = header.raw;      } 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) {      return request_handles.size() - 1;  } +void HLERequestContext::ClearIncomingObjects() { +    request_handles.clear(); +} +  ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf,                                                                  Process& src_process,                                                                  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:       */      u32 AddOutgoingHandle(SharedPtr<Object> object); +    /** +     * Discards all Objects from the context, invalidating all ids. This may be called after reading +     * out all incoming objects, so that the buffer memory can be re-used for outgoing handles, but +     * this is not required. +     */ +    void ClearIncomingObjects(); +  private:      friend class Service::ServiceFrameworkBase; | 
