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).
This commit is contained in:
		| @@ -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; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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) { | ||||||
|   | |||||||
| @@ -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; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yuri Kunde Schlesner
					Yuri Kunde Schlesner