mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 17:52:52 +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;
|
||||
}
|
||||
|
||||
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 {
|
||||
return call<Rpc_alloc_policy>(size); }
|
||||
|
||||
|
@ -142,6 +142,8 @@ struct Genode::Trace::Session : Genode::Session
|
||||
Subject_id);
|
||||
GENODE_RPC_THROW(Rpc_subjects, size_t, subjects,
|
||||
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_TYPE_LIST(Nonexistent_subject), Subject_id);
|
||||
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,
|
||||
Rpc_unload_policy, Rpc_trace, Rpc_rule, Rpc_pause,
|
||||
Rpc_resume, Rpc_subjects, Rpc_subject_info, Rpc_buffer,
|
||||
Rpc_free);
|
||||
Rpc_free, Rpc_subject_infos);
|
||||
};
|
||||
|
||||
#endif /* _INCLUDE__TRACE_SESSION__TRACE_SESSION_H_ */
|
||||
|
@ -74,6 +74,7 @@ class Genode::Trace::Session_component
|
||||
|
||||
Dataspace_capability dataspace();
|
||||
size_t subjects();
|
||||
size_t subject_infos();
|
||||
|
||||
Policy_id alloc_policy(size_t) override;
|
||||
Dataspace_capability policy(Policy_id) override;
|
||||
|
@ -436,6 +436,22 @@ class Genode::Trace::Subject_registry
|
||||
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
|
||||
*
|
||||
|
@ -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)
|
||||
{
|
||||
if (size > _argument_buffer.size())
|
||||
|
Loading…
x
Reference in New Issue
Block a user