From 8e252f79f82d50cd9566548d95f6ca8a7ff12be1 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Mon, 20 Dec 2021 13:52:27 +0100 Subject: [PATCH] Remove mutex from 'Genode::Trace_output' Fixes #4356 --- repos/base/include/base/log.h | 25 +++++++++++++++--------- repos/base/lib/symbols/ld | 3 +-- repos/base/src/lib/base/default_log.cc | 10 +--------- repos/base/src/lib/base/log.cc | 16 +++------------ repos/os/src/server/log_terminal/main.cc | 3 ++- 5 files changed, 23 insertions(+), 34 deletions(-) diff --git a/repos/base/include/base/log.h b/repos/base/include/base/log.h index 1e4d9e4bf3..89d00d32b6 100644 --- a/repos/base/include/base/log.h +++ b/repos/base/include/base/log.h @@ -15,6 +15,7 @@ #define _INCLUDE__BASE__LOG_H_ #include +#include #include #include @@ -107,23 +108,29 @@ class Genode::Trace_output { private: - Mutex _mutex { }; + struct Write_trace_fn + { + void operator () (char const *); + }; - Output &_output; - - void _acquire(); - void _release(); + /* cannot include log_session.h here because of recursion */ + enum { LOG_SESSION_MAX_STRING_LEN = 232 }; + typedef Buffered_output + Buffered_trace_output; public: - Trace_output(Output &output) : _output(output) { } + Trace_output() { } template void output(ARGS &&... args) { - _acquire(); - Output::out_args(_output, args...); - _release(); + Buffered_trace_output buffered_trace_output + { Write_trace_fn() }; + + Output::out_args(buffered_trace_output, args...); + buffered_trace_output.out_string("\n"); } /** diff --git a/repos/base/lib/symbols/ld b/repos/base/lib/symbols/ld index 7c50906994..4d47f01de2 100644 --- a/repos/base/lib/symbols/ld +++ b/repos/base/lib/symbols/ld @@ -73,8 +73,7 @@ _ZN6Genode11Sliced_heapD2Ev T _ZN6Genode12Address_infoC1Em T _ZN6Genode12Address_infoC2Em T _ZN6Genode12Trace_output12trace_outputEv T -_ZN6Genode12Trace_output8_acquireEv T -_ZN6Genode12Trace_output8_releaseEv T +_ZN6Genode12Trace_output14Write_trace_fnclEPKc T _ZN6Genode13Avl_node_base15_rotate_subtreeEPS0_bRNS0_6PolicyE T _ZN6Genode13Avl_node_base18_rebalance_subtreeEPS0_RNS0_6PolicyE T _ZN6Genode13Avl_node_base6_adoptEPS0_bRNS0_6PolicyE T diff --git a/repos/base/src/lib/base/default_log.cc b/repos/base/src/lib/base/default_log.cc index 598dd457b5..161b9144cd 100644 --- a/repos/base/src/lib/base/default_log.cc +++ b/repos/base/src/lib/base/default_log.cc @@ -114,14 +114,6 @@ void Genode::init_log(Parent &parent) log_ptr = unmanaged_singleton(*buffered_log_output); /* enable trace back end */ - struct Write_trace_fn { void operator () (char const *s) { Thread::trace(s); } }; - - typedef Buffered_output - Buffered_trace_output; - - static Buffered_trace_output *buffered_trace_output = - unmanaged_singleton(Write_trace_fn()); - - trace_ptr = unmanaged_singleton(*buffered_trace_output); + trace_ptr = unmanaged_singleton(); } diff --git a/repos/base/src/lib/base/log.cc b/repos/base/src/lib/base/log.cc index 978414ddce..ef0bffac5f 100644 --- a/repos/base/src/lib/base/log.cc +++ b/repos/base/src/lib/base/log.cc @@ -13,6 +13,7 @@ /* Genode includes */ #include +#include using namespace Genode; @@ -61,18 +62,7 @@ void Raw::_release() } -void Trace_output::_acquire() +void Trace_output::Write_trace_fn::operator () (char const *s) { - _mutex.acquire(); -} - - -void Trace_output::_release() -{ - /* - * Add newline - */ - _output.out_string("\n"); - - _mutex.release(); + Thread::trace(s); } diff --git a/repos/os/src/server/log_terminal/main.cc b/repos/os/src/server/log_terminal/main.cc index 4ce160a66b..36e431aba3 100644 --- a/repos/os/src/server/log_terminal/main.cc +++ b/repos/os/src/server/log_terminal/main.cc @@ -24,6 +24,7 @@ namespace Terminal { class Session_component; class Root_component; class Main; + class Buffered_output; using namespace Genode; }; @@ -32,7 +33,7 @@ namespace Terminal { /** * Utility for the buffered output of small successive write operations */ -class Buffered_output +class Terminal::Buffered_output { private: