mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-21 20:54:35 +02:00
CONTEXT: lazily evaluate frames to only actually assemble when needed
This commit is contained in:
parent
0b46e0aeab
commit
b82814fb29
@ -3,14 +3,16 @@
|
|||||||
#include "base/context.hpp"
|
#include "base/context.hpp"
|
||||||
#include <boost/thread/tss.hpp>
|
#include <boost/thread/tss.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
using namespace icinga;
|
using namespace icinga;
|
||||||
|
|
||||||
static boost::thread_specific_ptr<std::vector<String>> l_Frames;
|
static boost::thread_specific_ptr<std::vector<std::function<void(std::ostream&)>>> l_Frames;
|
||||||
|
|
||||||
ContextFrame::ContextFrame(const String& message)
|
ContextFrame::ContextFrame(std::function<void(std::ostream&)> message)
|
||||||
{
|
{
|
||||||
GetFrames().emplace_back(message);
|
GetFrames().emplace_back(std::move(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextFrame::~ContextFrame()
|
ContextFrame::~ContextFrame()
|
||||||
@ -18,17 +20,23 @@ ContextFrame::~ContextFrame()
|
|||||||
GetFrames().pop_back();
|
GetFrames().pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<String>& ContextFrame::GetFrames()
|
std::vector<std::function<void(std::ostream&)>>& ContextFrame::GetFrames()
|
||||||
{
|
{
|
||||||
if (!l_Frames.get())
|
if (!l_Frames.get())
|
||||||
l_Frames.reset(new std::vector<String>());
|
l_Frames.reset(new std::vector<std::function<void(std::ostream&)>>());
|
||||||
|
|
||||||
return *l_Frames;
|
return *l_Frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextTrace::ContextTrace()
|
ContextTrace::ContextTrace()
|
||||||
: m_Frames(ContextFrame::GetFrames().rbegin(), ContextFrame::GetFrames().rend())
|
{
|
||||||
{ }
|
for (auto frame (ContextFrame::GetFrames().rbegin()); frame != ContextFrame::GetFrames().rend(); ++frame) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
|
||||||
|
(*frame)(oss);
|
||||||
|
m_Frames.emplace_back(oss.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ContextTrace::Print(std::ostream& fp) const
|
void ContextTrace::Print(std::ostream& fp) const
|
||||||
{
|
{
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "base/i2-base.hpp"
|
#include "base/i2-base.hpp"
|
||||||
#include "base/string.hpp"
|
#include "base/string.hpp"
|
||||||
|
#include <functional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace icinga
|
namespace icinga
|
||||||
@ -33,18 +34,21 @@ std::ostream& operator<<(std::ostream& stream, const ContextTrace& trace);
|
|||||||
class ContextFrame
|
class ContextFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ContextFrame(const String& message);
|
ContextFrame(std::function<void(std::ostream&)> message);
|
||||||
~ContextFrame();
|
~ContextFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::vector<String>& GetFrames();
|
static std::vector<std::function<void(std::ostream&)>>& GetFrames();
|
||||||
|
|
||||||
friend class ContextTrace;
|
friend class ContextTrace;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The currentContextFrame variable has to be volatile in order to prevent
|
/* The currentContextFrame variable has to be volatile in order to prevent
|
||||||
* the compiler from optimizing it away. */
|
* the compiler from optimizing it away. */
|
||||||
#define CONTEXT(message) volatile icinga::ContextFrame currentContextFrame(message)
|
#define CONTEXT(message) volatile icinga::ContextFrame currentContextFrame ([&](std::ostream& _CONTEXT_stream) { \
|
||||||
|
_CONTEXT_stream << message; \
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONTEXT_H */
|
#endif /* CONTEXT_H */
|
||||||
|
@ -66,9 +66,7 @@ bool Dependency::EvaluateApplyRule(const Checkable::Ptr& checkable, const ApplyR
|
|||||||
{
|
{
|
||||||
auto& di (rule.GetDebugInfo());
|
auto& di (rule.GetDebugInfo());
|
||||||
|
|
||||||
std::ostringstream msgbuf;
|
CONTEXT("Evaluating 'apply' rule (" << di << ")");
|
||||||
msgbuf << "Evaluating 'apply' rule (" << di << ")";
|
|
||||||
CONTEXT(msgbuf.str());
|
|
||||||
|
|
||||||
Host::Ptr host;
|
Host::Ptr host;
|
||||||
Service::Ptr service;
|
Service::Ptr service;
|
||||||
|
@ -65,9 +65,7 @@ bool Notification::EvaluateApplyRule(const Checkable::Ptr& checkable, const Appl
|
|||||||
{
|
{
|
||||||
auto& di (rule.GetDebugInfo());
|
auto& di (rule.GetDebugInfo());
|
||||||
|
|
||||||
std::ostringstream msgbuf;
|
CONTEXT("Evaluating 'apply' rule (" << di << ")");
|
||||||
msgbuf << "Evaluating 'apply' rule (" << di << ")";
|
|
||||||
CONTEXT(msgbuf.str());
|
|
||||||
|
|
||||||
Host::Ptr host;
|
Host::Ptr host;
|
||||||
Service::Ptr service;
|
Service::Ptr service;
|
||||||
|
@ -64,9 +64,7 @@ bool ScheduledDowntime::EvaluateApplyRule(const Checkable::Ptr& checkable, const
|
|||||||
{
|
{
|
||||||
auto& di (rule.GetDebugInfo());
|
auto& di (rule.GetDebugInfo());
|
||||||
|
|
||||||
std::ostringstream msgbuf;
|
CONTEXT("Evaluating 'apply' rule (" << di << ")");
|
||||||
msgbuf << "Evaluating 'apply' rule (" << di << ")";
|
|
||||||
CONTEXT(msgbuf.str());
|
|
||||||
|
|
||||||
Host::Ptr host;
|
Host::Ptr host;
|
||||||
Service::Ptr service;
|
Service::Ptr service;
|
||||||
|
@ -59,9 +59,7 @@ bool Service::EvaluateApplyRule(const Host::Ptr& host, const ApplyRule& rule, bo
|
|||||||
{
|
{
|
||||||
auto& di (rule.GetDebugInfo());
|
auto& di (rule.GetDebugInfo());
|
||||||
|
|
||||||
std::ostringstream msgbuf;
|
CONTEXT("Evaluating 'apply' rule (" << di << ")");
|
||||||
msgbuf << "Evaluating 'apply' rule (" << di << ")";
|
|
||||||
CONTEXT(msgbuf.str());
|
|
||||||
|
|
||||||
ScriptFrame frame(true);
|
ScriptFrame frame(true);
|
||||||
if (rule.GetScope())
|
if (rule.GetScope())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user