Skip to content
Snippets Groups Projects
Commit 6f97f9b5 authored by Mirko Wächter's avatar Mirko Wächter
Browse files

RTLogging is now redirected to ARMARX_LOGGING if RTLogging is not yet initialized

parent 288be78d
No related branches found
No related tags found
No related merge requests found
......@@ -25,7 +25,8 @@
namespace armarx
{
detail::RtMessageLogEntryDummy detail::RtMessageLogEntryDummy::Instance;
thread_local ControlThreadOutputBuffer* ControlThreadOutputBuffer::RtLoggingInstance{nullptr};
detail::RtMessageLogEntryNull detail::RtMessageLogEntryNull::Instance;
thread_local ControlThreadOutputBuffer* ControlThreadOutputBuffer::RtLoggingInstance {nullptr};
ControlThreadOutputBuffer::Entry& ControlThreadOutputBuffer::getWriteBuffer()
{
......@@ -192,27 +193,27 @@ namespace armarx
}
detail::RtMessageLogBuffer::RtMessageLogBuffer(const detail::RtMessageLogBuffer& other, bool minimize):
initialBufferSize{other.initialBufferSize * minimize},
initialBufferEntryNumbers{other.initialBufferEntryNumbers * minimize},
bufferMaxSize{other.bufferMaxSize * minimize},
bufferMaxNumberEntries{other.bufferMaxNumberEntries * minimize},
buffer(
minimize ?
other.buffer.size() + other.maxAlign - 1 - other.bufferSpace :
other.buffer.size(),
0),
bufferSpace{buffer.size()},
bufferPlace{buffer.data()},
entries(
minimize ?
other.entriesWritten :
other.entries.size(),
nullptr),
entriesWritten{0},
requiredAdditionalBufferSpace{other.requiredAdditionalBufferSpace},
requiredAdditionalEntries{other.requiredAdditionalEntries},
messagesLost{other.messagesLost},
maxAlign{1}
initialBufferSize {other.initialBufferSize * minimize},
initialBufferEntryNumbers {other.initialBufferEntryNumbers * minimize},
bufferMaxSize {other.bufferMaxSize * minimize},
bufferMaxNumberEntries {other.bufferMaxNumberEntries * minimize},
buffer(
minimize ?
other.buffer.size() + other.maxAlign - 1 - other.bufferSpace :
other.buffer.size(),
0),
bufferSpace {buffer.size()},
bufferPlace {buffer.data()},
entries(
minimize ?
other.entriesWritten :
other.entries.size(),
nullptr),
entriesWritten {0},
requiredAdditionalBufferSpace {other.requiredAdditionalBufferSpace},
requiredAdditionalEntries {other.requiredAdditionalEntries},
messagesLost {other.messagesLost},
maxAlign {1}
{
for (std::size_t idx = 0; idx < other.entries.size() && other.entries.at(idx); ++idx)
{
......@@ -223,19 +224,19 @@ namespace armarx
const auto hint = ARMARX_STREAM_PRINTER
{
out << "entry " << idx << " of " << other.entriesWritten
<< "\nbuffer first = " << static_cast<void*>(&buffer.front())
<< "\nbuffer last = " << static_cast<void*>(&buffer.back())
<< "\nbuffer size = " << buffer.size()
<< "\nbuffer place = " << bufferPlace
<< "\nbuffer space = " << bufferSpace
<< "\nentry size = " << entry->_sizeof()
<< "\nentry align = " << entry->_alignof()
<< "\n"
<< "\nother buffer size = " << other.buffer.size()
<< "\nother buffer space = " << other.bufferSpace
<< "\nother max align = " << other.maxAlign
<< "\n"
<< "\nthis = " << this;
<< "\nbuffer first = " << static_cast<void*>(&buffer.front())
<< "\nbuffer last = " << static_cast<void*>(&buffer.back())
<< "\nbuffer size = " << buffer.size()
<< "\nbuffer place = " << bufferPlace
<< "\nbuffer space = " << bufferSpace
<< "\nentry size = " << entry->_sizeof()
<< "\nentry align = " << entry->_alignof()
<< "\n"
<< "\nother buffer size = " << other.buffer.size()
<< "\nother buffer space = " << other.bufferSpace
<< "\nother max align = " << other.maxAlign
<< "\n"
<< "\nthis = " << this;
};
ARMARX_CHECK_NOT_NULL_W_HINT(place, hint);
ARMARX_CHECK_LESS_EQUAL_W_HINT(static_cast<void*>(&buffer.front()), static_cast<void*>(place), hint);
......@@ -326,9 +327,9 @@ namespace armarx
std::size_t messageBufferSize, std::size_t messageBufferNumberEntries,
std::size_t messageBufferMaxSize, std::size_t messageBufferMaxNumberEntries
):
sensorValuesTimestamp{IceUtil::Time::microSeconds(0)},
timeSinceLastIteration{IceUtil::Time::microSeconds(0)},
messages{messageBufferSize, messageBufferNumberEntries, messageBufferMaxSize, messageBufferMaxNumberEntries}
sensorValuesTimestamp {IceUtil::Time::microSeconds(0)},
timeSinceLastIteration {IceUtil::Time::microSeconds(0)},
messages {messageBufferSize, messageBufferNumberEntries, messageBufferMaxSize, messageBufferMaxNumberEntries}
{
//calculate size in bytes for one buffer
const std::size_t bytes = [&]
......@@ -398,12 +399,12 @@ namespace armarx
}
detail::ControlThreadOutputBufferEntry::ControlThreadOutputBufferEntry(const detail::ControlThreadOutputBufferEntry& other, bool minimize):
writeTimestamp{other.writeTimestamp},
sensorValuesTimestamp{other.sensorValuesTimestamp},
timeSinceLastIteration{other.timeSinceLastIteration},
iteration{other.iteration},
messages{other.messages, minimize},
buffer(other.buffer.size(), 0)
writeTimestamp {other.writeTimestamp},
sensorValuesTimestamp {other.sensorValuesTimestamp},
timeSinceLastIteration {other.timeSinceLastIteration},
iteration {other.iteration},
messages {other.messages, minimize},
buffer(other.buffer.size(), 0)
{
void* place = buffer.data();
std::size_t space = buffer.size();
......
......@@ -26,6 +26,8 @@
#include <vector>
#include <boost/format.hpp>
#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
#include <ArmarXCore/core/util/PropagateConst.h>
#include <ArmarXCore/core/util/TripleBuffer.h>
......@@ -40,6 +42,23 @@ namespace armarx
{
namespace detail
{
inline std::string armarx_sprintf_helper(boost::format& f)
{
return boost::str(f);
}
template<class T, class... Args>
inline std::string armarx_sprintf_helper(boost::format& f, T&& t, Args&& ... args)
{
return armarx_sprintf_helper(f % std::forward<T>(t), std::forward<Args>(args)...);
}
template<class... Args>
inline std::string armarx_sprintf(const std::string& formatString, Args&& ... args)
{
boost::format f(formatString);
return ::armarx::detail::armarx_sprintf_helper(f, std::forward<Args>(args)...);
}
struct RtMessageLogEntryBase
{
RtMessageLogEntryBase():
......@@ -80,12 +99,36 @@ namespace armarx
ARMARX_MINIMAL_PLACEMENT_CONSTRUCTION_HELPER
};
struct RtMessageLogEntryNull : RtMessageLogEntryBase
{
static RtMessageLogEntryNull Instance;
protected:
std::string format() const final override
{
return "";
}
std::size_t line() const final override
{
return 0;
}
std::string file() const final override
{
return "";
}
std::string func() const final override
{
return "";
}
ARMARX_MINIMAL_PLACEMENT_CONSTRUCTION_HELPER
};
}
}
namespace armarx
{
class RobotUnit;
class ControlThreadOutputBuffer;
struct ControlThreadOutputBuffer;
namespace RobotUnitModule
{
......@@ -104,7 +147,7 @@ namespace armarx
RtMessageLogBuffer() = delete;
RtMessageLogBuffer(RtMessageLogBuffer&&) = delete;
RtMessageLogBuffer& operator=(RtMessageLogBuffer&&) = delete;
RtMessageLogBuffer& operator=(RtMessageLogBuffer &&) = delete;
RtMessageLogBuffer& operator=(const RtMessageLogBuffer&) = delete;
void reset(std::size_t& bufferSize, std::size_t& numEntries, std::size_t iterationCount);
......@@ -117,7 +160,7 @@ namespace armarx
void deleteAll();
friend struct ControlThreadOutputBufferEntry;
friend class ::armarx::ControlThreadOutputBuffer;
friend struct ::armarx::ControlThreadOutputBuffer;
friend class ::armarx::RobotUnit;
friend class ::armarx::RobotUnitModule::Logging;
......@@ -155,7 +198,7 @@ namespace armarx
ControlThreadOutputBufferEntry() = delete;
ControlThreadOutputBufferEntry(ControlThreadOutputBufferEntry&&) = delete;
ControlThreadOutputBufferEntry& operator=(ControlThreadOutputBufferEntry&&) = delete;
ControlThreadOutputBufferEntry& operator=(ControlThreadOutputBufferEntry &&) = delete;
ControlThreadOutputBufferEntry& operator=(const ControlThreadOutputBufferEntry&) = delete;
std::size_t getDataBufferSize() const;
......@@ -244,10 +287,20 @@ namespace armarx
}
#define ARMARX_RT_LOGF(...) _detail_ARMARX_RT_LOGF(__FILE__, ARMARX_FUNCTION,__LINE__, __VA_ARGS__, true)
// ARMARX_INFO << deactivateSpam(1) << "Redirected RT Logging:\n" << ::armarx::detail::armarx_printf_helper(f, __VA_ARGS__);
#define _detail_ARMARX_RT_REDIRECT( ...) ([&]{ \
::armarx::detail::armarx_sprintf(__VA_ARGS__); \
ARMARX_INFO << deactivateSpam(1) << "Redirected RT Logging:\n";\
return &::armarx::detail::RtMessageLogEntryNull::Instance;}())
#define ARMARX_RT_LOGF(...) (*((::armarx::ControlThreadOutputBuffer::GetRtLoggingInstance())? _detail_ARMARX_RT_LOGF(__FILE__, ARMARX_FUNCTION,__LINE__, __VA_ARGS__, true) : _detail_ARMARX_RT_REDIRECT(__VA_ARGS__)))
#define _detail_ARMARX_RT_LOGF(file_, func_, line_, FormatString, ...) \
(*[&]{ \
([&]{ \
using namespace ::armarx; \
using RtMessageLogEntryBase = ControlThreadOutputBuffer::RtMessageLogEntryBase; \
struct RtMessageLogEntry : RtMessageLogEntryBase \
......@@ -268,7 +321,7 @@ namespace armarx
ARMARX_CHECK_NOT_NULL(::armarx::ControlThreadOutputBuffer::GetRtLoggingInstance()); \
return ::armarx::ControlThreadOutputBuffer::GetRtLoggingInstance() \
->addMessageToLog<RtMessageLogEntry>(__VA_ARGS__); \
}())
}())
#define ARMARX_RT_LOGF_DEBUG(...) ARMARX_RT_LOGF(__VA_ARGS__).setLoggingLevel(::armarx::eDEBUG)
#define ARMARX_RT_LOGF_VERBOSE(...) ARMARX_RT_LOGF(__VA_ARGS__).setLoggingLevel(::armarx::eVERBOSE)
......@@ -314,13 +367,13 @@ namespace armarx
std::size_t bufferMaxSize, std::size_t bufferMaxNumberEntries
):
initialBufferSize {bufferSize},
initialBufferEntryNumbers {numEntries},
bufferMaxSize {bufferMaxSize},
bufferMaxNumberEntries {bufferMaxNumberEntries},
buffer(bufferSize, 0),
bufferSpace {buffer.size()},
bufferPlace {buffer.data()},
entries(numEntries, nullptr)
initialBufferEntryNumbers {numEntries},
bufferMaxSize {bufferMaxSize},
bufferMaxNumberEntries {bufferMaxNumberEntries},
buffer(bufferSize, 0),
bufferSpace {buffer.size()},
bufferPlace {buffer.data()},
entries(numEntries, nullptr)
{}
inline RtMessageLogBuffer::~RtMessageLogBuffer()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment