mirror of
https://github.com/citra-mirror/citra.git
synced 2024-08-23 04:40:42 +02: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
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user