mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	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:
		
							parent
							
								
									8cb65fe65a
								
							
						
					
					
						commit
						92ca422088
					
				
					 3 changed files with 14 additions and 0 deletions
				
			
		|  | @ -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; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue