mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-21 18:06:50 +00:00
trace: support to request subject infos batched
Optimize requesting the Subject_infos from O(n) to O(1) RPC call. Issue #3610
This commit is contained in:
parent
dd899fde29
commit
1a94338389
@ -86,6 +86,22 @@ struct Genode::Trace::Session_client : Genode::Rpc_client<Genode::Trace::Session
|
|||||||
return num_subjects;
|
return num_subjects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename FN>
|
||||||
|
size_t for_each_subject_info(FN const &fn)
|
||||||
|
{
|
||||||
|
size_t const num_subjects = call<Rpc_subject_infos>();
|
||||||
|
size_t const max_subjects = _argument_buffer.size / (sizeof(Subject_info) + sizeof(Subject_id));
|
||||||
|
|
||||||
|
Subject_info * const infos = reinterpret_cast<Subject_info *>(_argument_buffer.base);
|
||||||
|
Subject_id * const ids = reinterpret_cast<Subject_id *>(infos + max_subjects);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < num_subjects; i++) {
|
||||||
|
fn(ids[i], infos[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return num_subjects;
|
||||||
|
}
|
||||||
|
|
||||||
Policy_id alloc_policy(size_t size) override {
|
Policy_id alloc_policy(size_t size) override {
|
||||||
return call<Rpc_alloc_policy>(size); }
|
return call<Rpc_alloc_policy>(size); }
|
||||||
|
|
||||||
|
@ -142,6 +142,8 @@ struct Genode::Trace::Session : Genode::Session
|
|||||||
Subject_id);
|
Subject_id);
|
||||||
GENODE_RPC_THROW(Rpc_subjects, size_t, subjects,
|
GENODE_RPC_THROW(Rpc_subjects, size_t, subjects,
|
||||||
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps));
|
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps));
|
||||||
|
GENODE_RPC_THROW(Rpc_subject_infos, size_t, subject_infos,
|
||||||
|
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps));
|
||||||
GENODE_RPC_THROW(Rpc_subject_info, Subject_info, subject_info,
|
GENODE_RPC_THROW(Rpc_subject_info, Subject_info, subject_info,
|
||||||
GENODE_TYPE_LIST(Nonexistent_subject), Subject_id);
|
GENODE_TYPE_LIST(Nonexistent_subject), Subject_id);
|
||||||
GENODE_RPC_THROW(Rpc_buffer, Dataspace_capability, buffer,
|
GENODE_RPC_THROW(Rpc_buffer, Dataspace_capability, buffer,
|
||||||
@ -153,7 +155,7 @@ struct Genode::Trace::Session : Genode::Session
|
|||||||
GENODE_RPC_INTERFACE(Rpc_dataspace, Rpc_alloc_policy, Rpc_policy,
|
GENODE_RPC_INTERFACE(Rpc_dataspace, Rpc_alloc_policy, Rpc_policy,
|
||||||
Rpc_unload_policy, Rpc_trace, Rpc_rule, Rpc_pause,
|
Rpc_unload_policy, Rpc_trace, Rpc_rule, Rpc_pause,
|
||||||
Rpc_resume, Rpc_subjects, Rpc_subject_info, Rpc_buffer,
|
Rpc_resume, Rpc_subjects, Rpc_subject_info, Rpc_buffer,
|
||||||
Rpc_free);
|
Rpc_free, Rpc_subject_infos);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__TRACE_SESSION__TRACE_SESSION_H_ */
|
#endif /* _INCLUDE__TRACE_SESSION__TRACE_SESSION_H_ */
|
||||||
|
@ -74,6 +74,7 @@ class Genode::Trace::Session_component
|
|||||||
|
|
||||||
Dataspace_capability dataspace();
|
Dataspace_capability dataspace();
|
||||||
size_t subjects();
|
size_t subjects();
|
||||||
|
size_t subject_infos();
|
||||||
|
|
||||||
Policy_id alloc_policy(size_t) override;
|
Policy_id alloc_policy(size_t) override;
|
||||||
Dataspace_capability policy(Policy_id) override;
|
Dataspace_capability policy(Policy_id) override;
|
||||||
|
@ -436,6 +436,22 @@ class Genode::Trace::Subject_registry
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve Subject_infos batched
|
||||||
|
*/
|
||||||
|
size_t subjects(Subject_info * const dst, Subject_id * ids, size_t const len)
|
||||||
|
{
|
||||||
|
Mutex::Guard guard(_mutex);
|
||||||
|
|
||||||
|
unsigned i = 0;
|
||||||
|
for (Subject *s = _entries.first(); s && i < len; s = s->next()) {
|
||||||
|
ids[i] = s->id();
|
||||||
|
dst[i++] = s->info();
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove subject and release resources
|
* Remove subject and release resources
|
||||||
*
|
*
|
||||||
|
@ -36,6 +36,18 @@ size_t Session_component::subjects()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t Session_component::subject_infos()
|
||||||
|
{
|
||||||
|
_subjects.import_new_sources(_sources);
|
||||||
|
|
||||||
|
size_t const count = _argument_buffer.size() / (sizeof(Subject_info) + sizeof(Subject_id));
|
||||||
|
Subject_info *infos = _argument_buffer.local_addr<Subject_info>();
|
||||||
|
Subject_id *ids = reinterpret_cast<Subject_id *>(infos + count);
|
||||||
|
|
||||||
|
return _subjects.subjects(infos, ids, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Policy_id Session_component::alloc_policy(size_t size)
|
Policy_id Session_component::alloc_policy(size_t size)
|
||||||
{
|
{
|
||||||
if (size > _argument_buffer.size())
|
if (size > _argument_buffer.size())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user