Remove mutex from 'Genode::Trace_output'

Fixes #4356
This commit is contained in:
Christian Prochaska
2021-12-20 13:52:27 +01:00
committed by Christian Helmuth
parent e6c5e5e8b9
commit 8e252f79f8
5 changed files with 23 additions and 34 deletions

View File

@ -15,6 +15,7 @@
#define _INCLUDE__BASE__LOG_H_ #define _INCLUDE__BASE__LOG_H_
#include <base/output.h> #include <base/output.h>
#include <base/buffered_output.h>
#include <base/mutex.h> #include <base/mutex.h>
#include <trace/timestamp.h> #include <trace/timestamp.h>
@ -107,23 +108,29 @@ class Genode::Trace_output
{ {
private: private:
Mutex _mutex { }; struct Write_trace_fn
{
void operator () (char const *);
};
Output &_output; /* cannot include log_session.h here because of recursion */
enum { LOG_SESSION_MAX_STRING_LEN = 232 };
void _acquire(); typedef Buffered_output<LOG_SESSION_MAX_STRING_LEN,
void _release(); Write_trace_fn>
Buffered_trace_output;
public: public:
Trace_output(Output &output) : _output(output) { } Trace_output() { }
template <typename... ARGS> template <typename... ARGS>
void output(ARGS &&... args) void output(ARGS &&... args)
{ {
_acquire(); Buffered_trace_output buffered_trace_output
Output::out_args(_output, args...); { Write_trace_fn() };
_release();
Output::out_args(buffered_trace_output, args...);
buffered_trace_output.out_string("\n");
} }
/** /**

View File

@ -73,8 +73,7 @@ _ZN6Genode11Sliced_heapD2Ev T
_ZN6Genode12Address_infoC1Em T _ZN6Genode12Address_infoC1Em T
_ZN6Genode12Address_infoC2Em T _ZN6Genode12Address_infoC2Em T
_ZN6Genode12Trace_output12trace_outputEv T _ZN6Genode12Trace_output12trace_outputEv T
_ZN6Genode12Trace_output8_acquireEv T _ZN6Genode12Trace_output14Write_trace_fnclEPKc T
_ZN6Genode12Trace_output8_releaseEv T
_ZN6Genode13Avl_node_base15_rotate_subtreeEPS0_bRNS0_6PolicyE T _ZN6Genode13Avl_node_base15_rotate_subtreeEPS0_bRNS0_6PolicyE T
_ZN6Genode13Avl_node_base18_rebalance_subtreeEPS0_RNS0_6PolicyE T _ZN6Genode13Avl_node_base18_rebalance_subtreeEPS0_RNS0_6PolicyE T
_ZN6Genode13Avl_node_base6_adoptEPS0_bRNS0_6PolicyE T _ZN6Genode13Avl_node_base6_adoptEPS0_bRNS0_6PolicyE T

View File

@ -114,14 +114,6 @@ void Genode::init_log(Parent &parent)
log_ptr = unmanaged_singleton<Log>(*buffered_log_output); log_ptr = unmanaged_singleton<Log>(*buffered_log_output);
/* enable trace back end */ /* enable trace back end */
struct Write_trace_fn { void operator () (char const *s) { Thread::trace(s); } }; trace_ptr = unmanaged_singleton<Trace_output>();
typedef Buffered_output<Log_session::MAX_STRING_LEN, Write_trace_fn>
Buffered_trace_output;
static Buffered_trace_output *buffered_trace_output =
unmanaged_singleton<Buffered_trace_output>(Write_trace_fn());
trace_ptr = unmanaged_singleton<Trace_output>(*buffered_trace_output);
} }

View File

@ -13,6 +13,7 @@
/* Genode includes */ /* Genode includes */
#include <base/log.h> #include <base/log.h>
#include <base/thread.h>
using namespace Genode; 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(); Thread::trace(s);
}
void Trace_output::_release()
{
/*
* Add newline
*/
_output.out_string("\n");
_mutex.release();
} }

View File

@ -24,6 +24,7 @@ namespace Terminal {
class Session_component; class Session_component;
class Root_component; class Root_component;
class Main; class Main;
class Buffered_output;
using namespace Genode; using namespace Genode;
}; };
@ -32,7 +33,7 @@ namespace Terminal {
/** /**
* Utility for the buffered output of small successive write operations * Utility for the buffered output of small successive write operations
*/ */
class Buffered_output class Terminal::Buffered_output
{ {
private: private: