64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
 | |
| // Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #ifndef SPDLOG_HEADER_ONLY
 | |
|     #include <spdlog/details/backtracer.h>
 | |
| #endif
 | |
| namespace spdlog {
 | |
| namespace details {
 | |
| SPDLOG_INLINE backtracer::backtracer(const backtracer &other) {
 | |
|     std::lock_guard<std::mutex> lock(other.mutex_);
 | |
|     enabled_ = other.enabled();
 | |
|     messages_ = other.messages_;
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE backtracer::backtracer(backtracer &&other) SPDLOG_NOEXCEPT {
 | |
|     std::lock_guard<std::mutex> lock(other.mutex_);
 | |
|     enabled_ = other.enabled();
 | |
|     messages_ = std::move(other.messages_);
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE backtracer &backtracer::operator=(backtracer other) {
 | |
|     std::lock_guard<std::mutex> lock(mutex_);
 | |
|     enabled_ = other.enabled();
 | |
|     messages_ = std::move(other.messages_);
 | |
|     return *this;
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE void backtracer::enable(size_t size) {
 | |
|     std::lock_guard<std::mutex> lock{mutex_};
 | |
|     enabled_.store(true, std::memory_order_relaxed);
 | |
|     messages_ = circular_q<log_msg_buffer>{size};
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE void backtracer::disable() {
 | |
|     std::lock_guard<std::mutex> lock{mutex_};
 | |
|     enabled_.store(false, std::memory_order_relaxed);
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE bool backtracer::enabled() const { return enabled_.load(std::memory_order_relaxed); }
 | |
| 
 | |
| SPDLOG_INLINE void backtracer::push_back(const log_msg &msg) {
 | |
|     std::lock_guard<std::mutex> lock{mutex_};
 | |
|     messages_.push_back(log_msg_buffer{msg});
 | |
| }
 | |
| 
 | |
| SPDLOG_INLINE bool backtracer::empty() const {
 | |
|     std::lock_guard<std::mutex> lock{mutex_};
 | |
|     return messages_.empty();
 | |
| }
 | |
| 
 | |
| // pop all items in the q and apply the given fun on each of them.
 | |
| SPDLOG_INLINE void backtracer::foreach_pop(std::function<void(const details::log_msg &)> fun) {
 | |
|     std::lock_guard<std::mutex> lock{mutex_};
 | |
|     while (!messages_.empty()) {
 | |
|         auto &front_msg = messages_.front();
 | |
|         fun(front_msg);
 | |
|         messages_.pop_front();
 | |
|     }
 | |
| }
 | |
| }  // namespace details
 | |
| }  // namespace spdlog
 |