Replaced backtace implementation

This commit is contained in:
gabime
2019-08-26 19:59:16 +03:00
parent f330dd210e
commit 04a8485b17
9 changed files with 104 additions and 369 deletions

View File

@@ -0,0 +1,45 @@
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
#pragma once
#include "spdlog/common.h"
#include "spdlog/details/log_msg_buffer.h"
#include "spdlog/details/circular_q.h"
#include "spdlog/sinks/sink.h"
#include <mutex>
// Store log messages in circular buffer.
// Useful for storing debug data in case of error/warning happens.
namespace spdlog {
namespace details {
class backtracer
{
std::mutex mutex_;
circular_q<log_msg_buffer> messages_;
public:
explicit backtracer(size_t n_message)
: messages_{n_message}
{}
void add_msg(const log_msg &msg)
{
std::lock_guard<std::mutex> lock{mutex_};
messages_.push_back(log_msg_buffer{msg});
}
// pop all items in the q and apply the give fun on each of them.
void foreach_pop(std::function<void(const details::log_msg)> fun)
{
while (!messages_.empty())
{
log_msg_buffer popped;
messages_.pop_front(popped);
fun(popped);
}
}
};
} // namespace details
} // namespace spdlog

View File

@@ -62,11 +62,6 @@ void SPDLOG_INLINE thread_pool::post_flush(async_logger_ptr &&worker_ptr, async_
post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::flush), overflow_policy);
}
void SPDLOG_INLINE thread_pool::post_dump_backtrace(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy)
{
post_async_msg_(async_msg(std::move(worker_ptr), async_msg_type::dump_backtrace), overflow_policy);
}
size_t SPDLOG_INLINE thread_pool::overrun_counter()
{
return q_.overrun_counter();
@@ -114,18 +109,17 @@ bool SPDLOG_INLINE thread_pool::process_next_msg_()
return true;
}
case async_msg_type ::dump_backtrace:
{
incoming_async_msg.worker_ptr->backend_dump_backtrace_();
return true;
}
case async_msg_type::terminate:
{
return false;
}
default:
{
assert(false && "Unexpected async_msg_type");
}
assert(false && "Unexpected async_msg_type");
}
return true;
}

View File

@@ -24,8 +24,7 @@ enum class async_msg_type
{
log,
flush,
terminate,
dump_backtrace
terminate
};
#include "spdlog/details/log_msg_buffer.h"
@@ -97,7 +96,6 @@ public:
void post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy);
void post_flush(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy);
void post_dump_backtrace(async_logger_ptr &&worker_ptr, async_overflow_policy overflow_policy);
size_t overrun_counter();
private: