From 4fd1b52d1fcbf3a0d2017ab96210512f668692cd Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Thu, 15 Sep 2022 10:40:07 +0200 Subject: [PATCH] trace_recorder: adopt Genode::Dictionary genodelabs/genode#4610 --- repos/gems/src/app/trace_recorder/backend.h | 21 ++-- repos/gems/src/app/trace_recorder/monitor.cc | 32 ++++--- .../src/app/trace_recorder/named_registry.h | 96 ------------------- repos/gems/src/app/trace_recorder/policy.cc | 4 +- repos/gems/src/app/trace_recorder/policy.h | 14 ++- 5 files changed, 38 insertions(+), 129 deletions(-) delete mode 100644 repos/gems/src/app/trace_recorder/named_registry.h diff --git a/repos/gems/src/app/trace_recorder/backend.h b/repos/gems/src/app/trace_recorder/backend.h index 0dbb4ac1dc..e3cf765b26 100644 --- a/repos/gems/src/app/trace_recorder/backend.h +++ b/repos/gems/src/app/trace_recorder/backend.h @@ -14,32 +14,33 @@ #ifndef _BACKEND_H_ #define _BACKEND_H_ +/* Genode includes */ +#include + /* local includes */ -#include #include namespace Trace_recorder { class Backend_base; - using Backends = Named_registry; + using Backend_name = Genode::String<64>; + using Backends = Genode::Dictionary; } class Trace_recorder::Backend_base : Backends::Element { protected: - friend class Backends::Element; - friend class Avl_node; - friend class Avl_tree; + friend class Genode::Dictionary; + friend class Genode::Avl_node; + friend class Genode::Avl_tree; public: - - using Name = Backends::Element::Name; + using Name = Backend_name; using Backends::Element::name; - using Backends::Element::Element; - Backend_base(Backends & registry, Name const &name) - : Backends::Element(registry, name) + Backend_base(Backends & backends, Name const &name) + : Backends::Element(backends, name) { } virtual ~Backend_base() { } diff --git a/repos/gems/src/app/trace_recorder/monitor.cc b/repos/gems/src/app/trace_recorder/monitor.cc index f10cc016d3..c42e87a9de 100644 --- a/repos/gems/src/app/trace_recorder/monitor.cc +++ b/repos/gems/src/app/trace_recorder/monitor.cc @@ -104,11 +104,14 @@ void Trace_recorder::Monitor::start(Xml_node config) /* find and assign policy; create/insert if not present */ Policy::Name const policy_name = session_policy.attribute_value("policy", Policy::Name()); - bool create = true; - _policies.apply(policy_name, [&] (Policy & policy) { - _trace.trace(id, policy.id(), buffer_sz); - create = false; - }); + bool const create = + _policies.with_element(policy_name, + [&] /* match */ (Policy & policy) { + _trace.trace(id, policy.id(), buffer_sz); + return false; + }, + [&] /* no_match */ { return true; } + ); /* create policy if it did not exist */ if (create) { @@ -128,14 +131,17 @@ void Trace_recorder::Monitor::start(Xml_node config) /* create and register writers at trace buffer */ session_policy.for_each_sub_node([&] (Xml_node & node) { - bool present = false; - _backends.apply(node.type(), [&] (Backend_base &backend) { - backend.create_writer(_alloc, - buffer.writers(), - _trace_directory->root(), - _trace_directory->subject_path(buffer.info())); - present = true; - }); + bool const present = + _backends.with_element(node.type(), + [&] /* match */ (Backend_base &backend) { + backend.create_writer(_alloc, + buffer.writers(), + _trace_directory->root(), + _trace_directory->subject_path(buffer.info())); + return true; + }, + [&] /* no_match */ { return false; } + ); if (!present) error("No writer available for <", node.type(), "/>."); diff --git a/repos/gems/src/app/trace_recorder/named_registry.h b/repos/gems/src/app/trace_recorder/named_registry.h deleted file mode 100644 index ea5c07047c..0000000000 --- a/repos/gems/src/app/trace_recorder/named_registry.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * \brief Utility for finding objecs by name - * \author Norman Feske - * \date 2021-11-11 - */ - -/* - * Copyright (C) 2021 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -#ifndef _NAMED_REGISTRY_H_ -#define _NAMED_REGISTRY_H_ - -#include -#include -#include - -namespace Trace_recorder { - using namespace Genode; - - template class Named_registry; -} - -template -class Trace_recorder::Named_registry : Noncopyable -{ - private: - - Avl_tree _tree { }; - - public: - - class Element : private Avl_node - { - public: - - using Name = Genode::String<64>; - Name const name; - - private: - - Named_registry &_registry; - - bool higher(T const *other) const { return name > other->name; } - - friend class Avl_tree; - friend class Avl_node; - friend class Named_registry; - - static T *_matching_sub_tree(T &curr, Name const &name) - { - typename Avl_node::Side side = (curr.name > name); - - return curr.Avl_node::child(side); - } - - public: - - Element(Named_registry ®istry, Name const &name) - : - name(name), _registry(registry) - { - _registry._tree.insert(this); - } - - ~Element() - { - _registry._tree.remove(this); - } - }; - - template - void apply(typename Element::Name const &name, FN && fn) - { - T *curr_ptr = _tree.first(); - for (;;) { - if (!curr_ptr) - return; - - if (curr_ptr->name == name) { - fn(*curr_ptr); - return; - } - - curr_ptr = Element::_matching_sub_tree(*curr_ptr, name); - } - } - - template - void for_each(FN && fn) { _tree.for_each(fn); } -}; - -#endif /* _NAMED_REGISTRY_H_ */ diff --git a/repos/gems/src/app/trace_recorder/policy.cc b/repos/gems/src/app/trace_recorder/policy.cc index 03bd389a42..f39fbce27f 100644 --- a/repos/gems/src/app/trace_recorder/policy.cc +++ b/repos/gems/src/app/trace_recorder/policy.cc @@ -19,9 +19,9 @@ using namespace Genode; Trace_recorder::Policy::Policy(Env &env, Trace::Connection &trace, Policy::Name const &name, - Policies ®istry) + Policies &policies) : - Policies::Element(registry, name), + Policies::Element(policies, name), _env(env), _trace(trace), _rom(env, name.string()) { Dataspace_capability dst_ds = _trace.policy(_id); diff --git a/repos/gems/src/app/trace_recorder/policy.h b/repos/gems/src/app/trace_recorder/policy.h index 1c7737b870..6653b329dd 100644 --- a/repos/gems/src/app/trace_recorder/policy.h +++ b/repos/gems/src/app/trace_recorder/policy.h @@ -14,10 +14,8 @@ #ifndef _POLICY_H_ #define _POLICY_H_ -/* local includes */ -#include - /* Genode includes */ +#include #include #include #include @@ -25,7 +23,8 @@ namespace Trace_recorder { class Policy; - using Policies = Named_registry; + using Policy_name = Genode::String<64>; + using Policies = Genode::Dictionary; } @@ -35,7 +34,7 @@ namespace Trace_recorder { class Trace_recorder::Policy : Policies::Element { private: - friend class Policies::Element; + friend class Genode::Dictionary; friend class Genode::Avl_node; friend class Genode::Avl_tree; @@ -48,14 +47,13 @@ class Trace_recorder::Policy : Policies::Element public: - using Name = Policies::Element::Name; + using Name = Policy_name; using Policies::Element::name; - using Policies::Element::Element; Policy(Genode::Env &env, Genode::Trace::Connection &trace, Name const &name, - Policies ®istry); + Policies &policies); /***************