hle_ipc: Add helper functions to get copy/move handles
This commit is contained in:
parent
0a40106cf1
commit
e3e6a11ab8
2 changed files with 16 additions and 2 deletions
|
@ -75,10 +75,14 @@ void HLERequestContext::ParseCommandBuffer(const HandleTable& handle_table, u32_
|
||||||
if (incoming) {
|
if (incoming) {
|
||||||
// Populate the object lists with the data in the IPC request.
|
// Populate the object lists with the data in the IPC request.
|
||||||
for (u32 handle = 0; handle < handle_descriptor_header->num_handles_to_copy; ++handle) {
|
for (u32 handle = 0; handle < handle_descriptor_header->num_handles_to_copy; ++handle) {
|
||||||
copy_objects.push_back(handle_table.GetGeneric(rp.Pop<Handle>()));
|
const u32 copy_handle{rp.Pop<Handle>()};
|
||||||
|
copy_handles.push_back(copy_handle);
|
||||||
|
copy_objects.push_back(handle_table.GetGeneric(copy_handle));
|
||||||
}
|
}
|
||||||
for (u32 handle = 0; handle < handle_descriptor_header->num_handles_to_move; ++handle) {
|
for (u32 handle = 0; handle < handle_descriptor_header->num_handles_to_move; ++handle) {
|
||||||
move_objects.push_back(handle_table.GetGeneric(rp.Pop<Handle>()));
|
const u32 move_handle{rp.Pop<Handle>()};
|
||||||
|
move_handles.push_back(move_handle);
|
||||||
|
move_objects.push_back(handle_table.GetGeneric(move_handle));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// For responses we just ignore the handles, they're empty and will be populated when
|
// For responses we just ignore the handles, they're empty and will be populated when
|
||||||
|
|
|
@ -210,6 +210,14 @@ public:
|
||||||
/// Helper function to test whether the output buffer at buffer_index can be written
|
/// Helper function to test whether the output buffer at buffer_index can be written
|
||||||
bool CanWriteBuffer(std::size_t buffer_index = 0) const;
|
bool CanWriteBuffer(std::size_t buffer_index = 0) const;
|
||||||
|
|
||||||
|
Handle GetCopyHandle(std::size_t index) const {
|
||||||
|
return copy_handles.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle GetMoveHandle(std::size_t index) const {
|
||||||
|
return move_handles.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::shared_ptr<T> GetCopyObject(std::size_t index) {
|
std::shared_ptr<T> GetCopyObject(std::size_t index) {
|
||||||
return DynamicObjectCast<T>(copy_objects.at(index));
|
return DynamicObjectCast<T>(copy_objects.at(index));
|
||||||
|
@ -285,6 +293,8 @@ private:
|
||||||
std::shared_ptr<Kernel::ServerSession> server_session;
|
std::shared_ptr<Kernel::ServerSession> server_session;
|
||||||
std::shared_ptr<KThread> thread;
|
std::shared_ptr<KThread> thread;
|
||||||
// TODO(yuriks): Check common usage of this and optimize size accordingly
|
// TODO(yuriks): Check common usage of this and optimize size accordingly
|
||||||
|
boost::container::small_vector<Handle, 8> move_handles;
|
||||||
|
boost::container::small_vector<Handle, 8> copy_handles;
|
||||||
boost::container::small_vector<std::shared_ptr<Object>, 8> move_objects;
|
boost::container::small_vector<std::shared_ptr<Object>, 8> move_objects;
|
||||||
boost::container::small_vector<std::shared_ptr<Object>, 8> copy_objects;
|
boost::container::small_vector<std::shared_ptr<Object>, 8> copy_objects;
|
||||||
boost::container::small_vector<std::shared_ptr<SessionRequestHandler>, 8> domain_objects;
|
boost::container::small_vector<std::shared_ptr<SessionRequestHandler>, 8> domain_objects;
|
||||||
|
|
Loading…
Reference in a new issue