diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 11:32:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 11:32:39 +0000 |
commit | 56ae875861ab260b80a030f50c4aff9f9dc8fff0 (patch) | |
tree | 531412110fc901a5918c7f7442202804a83cada9 /lib/base/context.cpp | |
parent | Initial commit. (diff) | |
download | icinga2-56ae875861ab260b80a030f50c4aff9f9dc8fff0.tar.xz icinga2-56ae875861ab260b80a030f50c4aff9f9dc8fff0.zip |
Adding upstream version 2.14.2.upstream/2.14.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/base/context.cpp')
-rw-r--r-- | lib/base/context.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/base/context.cpp b/lib/base/context.cpp new file mode 100644 index 0000000..9c0a781 --- /dev/null +++ b/lib/base/context.cpp @@ -0,0 +1,64 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#include "base/context.hpp" +#include <boost/thread/tss.hpp> +#include <iostream> +#include <sstream> +#include <utility> + +using namespace icinga; + +static boost::thread_specific_ptr<std::vector<std::function<void(std::ostream&)>>> l_Frames; + +ContextFrame::ContextFrame(std::function<void(std::ostream&)> message) +{ + GetFrames().emplace_back(std::move(message)); +} + +ContextFrame::~ContextFrame() +{ + GetFrames().pop_back(); +} + +std::vector<std::function<void(std::ostream&)>>& ContextFrame::GetFrames() +{ + if (!l_Frames.get()) + l_Frames.reset(new std::vector<std::function<void(std::ostream&)>>()); + + return *l_Frames; +} + +ContextTrace::ContextTrace() +{ + 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 +{ + if (m_Frames.empty()) + return; + + fp << "\n"; + + int i = 0; + for (const String& frame : m_Frames) { + fp << "\t(" << i << ") " << frame << "\n"; + i++; + } +} + +size_t ContextTrace::GetLength() const +{ + return m_Frames.size(); +} + +std::ostream& icinga::operator<<(std::ostream& stream, const ContextTrace& trace) +{ + trace.Print(stream); + return stream; +} |