Просмотр исходного кода

Kernel: Allow clearing request_objects to re-use buffer space

Reduces the necessary allocation to max(in_handles, out_handles) rather
than (in_handles + out_handles).
Yuri Kunde Schlesner 9 лет назад
Родитель
Сommit
92ca422088
3 измененных файлов с 14 добавлено и 0 удалено
  1. 3 0
      src/core/hle/ipc_helpers.h
  2. 4 0
      src/core/hle/kernel/hle_ipc.cpp
  3. 7 0
      src/core/hle/kernel/hle_ipc.h

+ 3 - 0
src/core/hle/ipc_helpers.h

@@ -62,6 +62,9 @@ class RequestBuilder : public RequestHelperBase {
 public:
 public:
     RequestBuilder(Kernel::HLERequestContext& context, Header command_header)
     RequestBuilder(Kernel::HLERequestContext& context, Header command_header)
         : RequestHelperBase(context, 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;
         cmdbuf[0] = header.raw;
     }
     }
 
 

+ 4 - 0
src/core/hle/kernel/hle_ipc.cpp

@@ -35,6 +35,10 @@ u32 HLERequestContext::AddOutgoingHandle(SharedPtr<Object> object) {
     return request_handles.size() - 1;
     return request_handles.size() - 1;
 }
 }
 
 
+void HLERequestContext::ClearIncomingObjects() {
+    request_handles.clear();
+}
+
 ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf,
 ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* src_cmdbuf,
                                                                 Process& src_process,
                                                                 Process& src_process,
                                                                 HandleTable& src_table) {
                                                                 HandleTable& src_table) {

+ 7 - 0
src/core/hle/kernel/hle_ipc.h

@@ -110,6 +110,13 @@ public:
      */
      */
     u32 AddOutgoingHandle(SharedPtr<Object> object);
     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:
 private:
     friend class Service::ServiceFrameworkBase;
     friend class Service::ServiceFrameworkBase;