From 20cb73e9da293076d76a581308deef852700354a Mon Sep 17 00:00:00 2001 From: gabime Date: Mon, 22 Aug 2016 20:52:16 +0300 Subject: [PATCH] disable syslog by default (enable by #define SPDLOG_ENABLE_SYSLOG ) --- example/example.cpp | 1 + include/spdlog/common.h | 296 ++++++++++++------------ include/spdlog/details/mpmc_bounded_q.h | 19 +- include/spdlog/details/os.h | 7 +- include/spdlog/tweakme.h | 17 +- 5 files changed, 172 insertions(+), 168 deletions(-) diff --git a/example/example.cpp b/example/example.cpp index 692f8e9a..a150ed7a 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -5,6 +5,7 @@ // // spdlog usage example // +// #include "spdlog/spdlog.h" #include diff --git a/include/spdlog/common.h b/include/spdlog/common.h index 7885292e..1a8e2fff 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -1,153 +1,143 @@ -// -// Copyright(c) 2015 Gabi Melman. -// Distributed under the MIT License (http://opensource.org/licenses/MIT) -// - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -#include -#include -#endif - -#include - -//visual studio upto 2013 does not support noexcept nor constexpr -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define SPDLOG_NOEXCEPT throw() -#define SPDLOG_CONSTEXPR -#else -#define SPDLOG_NOEXCEPT noexcept -#define SPDLOG_CONSTEXPR constexpr -#endif - -#if defined(__GNUC__) || defined(__clang__) -#define DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) -#define DEPRECATED __declspec(deprecated) -#else -#define DEPRECATED -#endif - -#include - -#ifndef SPDLOG_ENABLE_SYSLOG -#if defined (__linux__) || defined(__APPLE__) || defined(__FreeBSD__) -#define SPDLOG_ENABLE_SYSLOG -#elif defined(sun) || defined(__sun) -#define SPDLOG_ENABLE_SYSLOG -#endif -#endif - - -#include - -namespace spdlog -{ - -class formatter; - -namespace sinks -{ -class sink; -} - -using log_clock = std::chrono::system_clock; -using sink_ptr = std::shared_ptr < sinks::sink >; -using sinks_init_list = std::initializer_list < sink_ptr >; -using formatter_ptr = std::shared_ptr; -#if defined(SPDLOG_NO_ATOMIC_LEVELS) -using level_t = details::null_atomic_int; -#else -using level_t = std::atomic_int; -#endif - -using log_err_handler = std::function; - -//Log level enum -namespace level -{ -typedef enum -{ - trace = 0, - debug = 1, - info = 2, - warn = 3, - err = 4, - critical = 5, - off = 6 -} level_enum; - -static const char* level_names[] { "trace", "debug", "info", "warning", "error", "critical", "off" }; - -static const char* short_level_names[] { "T", "D", "I", "W", "E", "C", "O" }; - -inline const char* to_str(spdlog::level::level_enum l) -{ - return level_names[l]; -} - -inline const char* to_short_str(spdlog::level::level_enum l) -{ - return short_level_names[l]; -} -} //level - - -// -// Async overflow policy - block by default. -// -enum class async_overflow_policy -{ - block_retry, // Block / yield / sleep until message can be enqueued - discard_log_msg // Discard the message it enqueue fails -}; - - -// -// Log exception -// -namespace details -{ -namespace os -{ -std::string errno_str(int err_num); -} -} -class spdlog_ex: public std::exception -{ -public: - spdlog_ex(const std::string& msg):_msg(msg) - {} - spdlog_ex(const std::string& msg, int last_errno) - { - _msg = msg + ": " + details::os::errno_str(last_errno); - } - const char* what() const SPDLOG_NOEXCEPT override - { - return _msg.c_str(); - } -private: - std::string _msg; - -}; - -// -// wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) -// -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -using filename_t = std::wstring; -#else -using filename_t = std::string; -#endif - - -} //spdlog +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) +#include +#include +#endif + +#include + +//visual studio upto 2013 does not support noexcept nor constexpr +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define SPDLOG_NOEXCEPT throw() +#define SPDLOG_CONSTEXPR +#else +#define SPDLOG_NOEXCEPT noexcept +#define SPDLOG_CONSTEXPR constexpr +#endif + +#if defined(__GNUC__) || defined(__clang__) +#define DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define DEPRECATED __declspec(deprecated) +#else +#define DEPRECATED +#endif + + +#include + +namespace spdlog +{ + + class formatter; + + namespace sinks + { + class sink; + } + + using log_clock = std::chrono::system_clock; + using sink_ptr = std::shared_ptr < sinks::sink >; + using sinks_init_list = std::initializer_list < sink_ptr >; + using formatter_ptr = std::shared_ptr; +#if defined(SPDLOG_NO_ATOMIC_LEVELS) + using level_t = details::null_atomic_int; +#else + using level_t = std::atomic_int; +#endif + + using log_err_handler = std::function; + + //Log level enum + namespace level + { + typedef enum + { + trace = 0, + debug = 1, + info = 2, + warn = 3, + err = 4, + critical = 5, + off = 6 + } level_enum; + + static const char* level_names[]{ "trace", "debug", "info", "warning", "error", "critical", "off" }; + + static const char* short_level_names[]{ "T", "D", "I", "W", "E", "C", "O" }; + + inline const char* to_str(spdlog::level::level_enum l) + { + return level_names[l]; + } + + inline const char* to_short_str(spdlog::level::level_enum l) + { + return short_level_names[l]; + } + } //level + + + // + // Async overflow policy - block by default. + // + enum class async_overflow_policy + { + block_retry, // Block / yield / sleep until message can be enqueued + discard_log_msg // Discard the message it enqueue fails + }; + + + // + // Log exception + // + namespace details + { + namespace os + { + std::string errno_str(int err_num); + } + } + class spdlog_ex: public std::exception + { + public: + spdlog_ex(const std::string& msg):_msg(msg) + {} + spdlog_ex(const std::string& msg, int last_errno) + { + _msg = msg + ": " + details::os::errno_str(last_errno); + } + const char* what() const SPDLOG_NOEXCEPT override + { + return _msg.c_str(); + } + private: + std::string _msg; + + }; + + // + // wchar support for windows file names (SPDLOG_WCHAR_FILENAMES must be defined) + // +#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) + using filename_t = std::wstring; +#else + using filename_t = std::string; +#endif + + +} //spdlog diff --git a/include/spdlog/details/mpmc_bounded_q.h b/include/spdlog/details/mpmc_bounded_q.h index ad14d6f2..034c3e2b 100644 --- a/include/spdlog/details/mpmc_bounded_q.h +++ b/include/spdlog/details/mpmc_bounded_q.h @@ -60,7 +60,8 @@ public: using item_type = T; mpmc_bounded_queue(size_t buffer_size) - : buffer_(new cell_t [buffer_size]), + :max_size_(buffer_size), + buffer_(new cell_t [buffer_size]), buffer_mask_(buffer_size - 1) { //queue size must be power of two @@ -132,6 +133,16 @@ public: return true; } + size_t approx_size() + { + size_t first_pos = dequeue_pos_.load(std::memory_order_relaxed); + size_t last_pos = enqueue_pos_.load(std::memory_order_relaxed); + if (last_pos <= first_pos) + return 0; + auto size = last_pos - first_pos; + return size < max_size_ ? size : max_size_; + } + private: struct cell_t { @@ -139,6 +150,8 @@ private: T data_; }; + size_t const max_size_; + static size_t const cacheline_size = 64; typedef char cacheline_pad_t [cacheline_size]; @@ -151,8 +164,8 @@ private: std::atomic dequeue_pos_; cacheline_pad_t pad3_; - mpmc_bounded_queue(mpmc_bounded_queue const&); - void operator = (mpmc_bounded_queue const&); + mpmc_bounded_queue(mpmc_bounded_queue const&) = delete; + void operator= (mpmc_bounded_queue const&) = delete; }; } // ns details diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index a6fbf6d9..2ae6078a 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -250,8 +250,7 @@ inline int utc_minutes_offset(const std::tm& tm = details::os::localtime()) offset -= tzinfo.StandardBias; return offset; #else - long int offset_seconds; - + #if defined(sun) || defined(__sun) // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris struct helper { @@ -280,9 +279,9 @@ inline int utc_minutes_offset(const std::tm& tm = details::os::localtime()) } }; - offset_seconds = helper::calculate_gmt_offset(tm); + long int offset_seconds = helper::calculate_gmt_offset(tm); #else - offset_seconds = tm.tm_gmtoff; + long int offset_seconds = tm.tm_gmtoff; #endif return static_cast(offset_seconds / 60); diff --git a/include/spdlog/tweakme.h b/include/spdlog/tweakme.h index 64bad92f..1af539bf 100644 --- a/include/spdlog/tweakme.h +++ b/include/spdlog/tweakme.h @@ -11,13 +11,6 @@ // /////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// By default, syslog sink is only enabled on tested operating systems. -// Uncomment to enable it unconditionally. -// -// #define SPDLOG_ENABLE_SYSLOG -/////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// // Under Linux, the much faster CLOCK_REALTIME_COARSE clock can be used. @@ -56,7 +49,6 @@ // #define SPDLOG_NO_NAME /////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////// // Uncomment to enable the SPDLOG_DEBUG/SPDLOG_TRACE macros. // @@ -100,3 +92,12 @@ // // #define SPDLOG_FMT_EXTERNAL /////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to enable syslog (disabled by default) +// +// #define SPDLOG_ENABLE_SYSLOG +/////////////////////////////////////////////////////////////////////////////// + +