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_
#include <base/output.h>
#include <base/buffered_output.h>
#include <base/mutex.h>
#include <trace/timestamp.h>
@ -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<LOG_SESSION_MAX_STRING_LEN,
Write_trace_fn>
Buffered_trace_output;
public:
Trace_output(Output &output) : _output(output) { }
Trace_output() { }
template <typename... ARGS>
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");
}
/**

View File

@ -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

View File

@ -114,14 +114,6 @@ void Genode::init_log(Parent &parent)
log_ptr = unmanaged_singleton<Log>(*buffered_log_output);
/* enable trace back end */
struct Write_trace_fn { void operator () (char const *s) { Thread::trace(s); } };
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);
trace_ptr = unmanaged_singleton<Trace_output>();
}

View File

@ -13,6 +13,7 @@
/* Genode includes */
#include <base/log.h>
#include <base/thread.h>
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);
}

View File

@ -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: