diff --git a/repos/os/src/app/top/main.cc b/repos/os/src/app/top/main.cc index f471e25c8..0a6997d25 100644 --- a/repos/os/src/app/top/main.cc +++ b/repos/os/src/app/top/main.cc @@ -82,14 +82,16 @@ struct Trace_subject_registry bool _reconstruct_trace_connection = false; + template unsigned update_subjects(Genode::Pd_session &pd, - Genode::Trace::Connection &trace) + Genode::Trace::Connection &trace, + FN const &fn) { Genode::Ram_quota ram_quota; do { try { - return trace.subjects(_subjects, MAX_SUBJECTS); + return trace.for_each_subject_info(fn); } catch (Genode::Out_of_ram) { trace.upgrade_ram(4096); } @@ -107,17 +109,7 @@ struct Trace_subject_registry void update(Genode::Pd_session &pd, Genode::Trace::Connection &trace, Genode::Allocator &alloc) { - unsigned const num_subjects = update_subjects(pd, trace); - - if (num_subjects == MAX_SUBJECTS) - Genode::error("Not enough memory for all threads - " - "calculated utilization is not sane nor " - "complete !", num_subjects); - - /* add and update existing entries */ - for (unsigned i = 0; i < num_subjects; i++) { - - Genode::Trace::Subject_id const id = _subjects[i]; + update_subjects(pd, trace, [&](Genode::Trace::Subject_id const &id, Genode::Trace::Subject_info const &info) { Entry *e = _lookup(id); if (!e) { @@ -125,7 +117,7 @@ struct Trace_subject_registry _entries.insert(e); } - e->update(trace.subject_info(id)); + e->update(info); /* remove dead threads which did not run in the last period */ if (e->info.state() == Genode::Trace::Subject_info::DEAD && @@ -135,7 +127,7 @@ struct Trace_subject_registry _entries.remove(e); Genode::destroy(alloc, e); } - } + }); if (_reconstruct_trace_connection) throw Genode::Out_of_ram();