-
Notifications
You must be signed in to change notification settings - Fork 51
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bea7b97
commit f8b2a90
Showing
56 changed files
with
15,485 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
# | ||
# Copyright(c) 2015 Ruslan Baratov. | ||
# Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||
# | ||
|
||
cmake_minimum_required(VERSION 3.1) | ||
project(spdlog VERSION 1.3.1 LANGUAGES CXX) | ||
include(CMakeDependentOption) | ||
include(GNUInstallDirs) | ||
|
||
#--------------------------------------------------------------------------------------- | ||
# set default build to release | ||
#--------------------------------------------------------------------------------------- | ||
if(NOT CMAKE_BUILD_TYPE) | ||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE) | ||
endif() | ||
|
||
message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) | ||
|
||
#--------------------------------------------------------------------------------------- | ||
# compiler config | ||
#--------------------------------------------------------------------------------------- | ||
set(CMAKE_CXX_STANDARD 11) | ||
set(CMAKE_CXX_STANDARD_REQUIRED ON) | ||
set(CMAKE_CXX_EXTENSIONS OFF) | ||
|
||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") | ||
add_compile_options("-Wall") | ||
add_compile_options("-Wextra") | ||
add_compile_options("-Wconversion") | ||
add_compile_options("-pedantic") | ||
add_compile_options("-Wfatal-errors") | ||
|
||
endif() | ||
|
||
#--------------------------------------------------------------------------------------- | ||
# address sanitizers check | ||
#--------------------------------------------------------------------------------------- | ||
include(cmake/sanitizers.cmake) | ||
|
||
#--------------------------------------------------------------------------------------- | ||
# spdlog target | ||
#--------------------------------------------------------------------------------------- | ||
add_library(spdlog INTERFACE) | ||
add_library(spdlog::spdlog ALIAS spdlog) | ||
|
||
# Check if spdlog is being used directly or via add_subdirectory | ||
set(SPDLOG_MASTER_PROJECT OFF) | ||
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) | ||
set(SPDLOG_MASTER_PROJECT ON) | ||
endif() | ||
|
||
option(SPDLOG_BUILD_EXAMPLES "Build examples" ${SPDLOG_MASTER_PROJECT}) | ||
option(SPDLOG_BUILD_BENCH "Build benchmarks" ${SPDLOG_MASTER_PROJECT}) | ||
option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) | ||
option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) | ||
|
||
if(SPDLOG_FMT_EXTERNAL) | ||
find_package(fmt REQUIRED CONFIG) | ||
endif() | ||
|
||
target_include_directories( | ||
spdlog | ||
INTERFACE | ||
"$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>" | ||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" | ||
) | ||
|
||
if(SPDLOG_FMT_EXTERNAL) | ||
target_compile_definitions(spdlog INTERFACE SPDLOG_FMT_EXTERNAL) | ||
target_link_libraries(spdlog INTERFACE fmt::fmt) | ||
endif() | ||
|
||
set(HEADER_BASE "${CMAKE_CURRENT_SOURCE_DIR}/include") | ||
|
||
if(SPDLOG_BUILD_EXAMPLES) | ||
add_subdirectory(example) | ||
endif() | ||
|
||
if(SPDLOG_BUILD_TESTS) | ||
include(CTest) | ||
add_subdirectory(tests) | ||
endif() | ||
|
||
if(SPDLOG_BUILD_BENCH) | ||
add_subdirectory(bench) | ||
endif() | ||
|
||
#--------------------------------------------------------------------------------------- | ||
# Install/export targets and files | ||
#--------------------------------------------------------------------------------------- | ||
# set files and directories | ||
set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") | ||
set(include_install_dir "${CMAKE_INSTALL_INCLUDEDIR}") | ||
set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig") | ||
set(version_config "${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") | ||
set(project_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") | ||
set(targets_config "${PROJECT_NAME}Targets.cmake") | ||
set(pkg_config "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc") | ||
set(targets_export_name "${PROJECT_NAME}Targets") | ||
set(namespace "${PROJECT_NAME}::") | ||
|
||
# generate package version file | ||
include(CMakePackageConfigHelpers) | ||
write_basic_package_version_file( | ||
"${version_config}" COMPATIBILITY SameMajorVersion | ||
) | ||
|
||
# configure pkg config file | ||
configure_file("cmake/spdlog.pc.in" "${pkg_config}" @ONLY) | ||
# configure spdlogConfig.cmake file | ||
configure_file("cmake/Config.cmake.in" "${project_config}" @ONLY) | ||
|
||
# install targets | ||
install( | ||
TARGETS spdlog | ||
EXPORT "${targets_export_name}" | ||
) | ||
|
||
# install headers | ||
install( | ||
DIRECTORY "${HEADER_BASE}/${PROJECT_NAME}" | ||
DESTINATION "${include_install_dir}" | ||
) | ||
|
||
# install project config and version file | ||
install( | ||
FILES "${project_config}" "${version_config}" | ||
DESTINATION "${config_install_dir}" | ||
) | ||
|
||
# install pkg config file | ||
install( | ||
FILES "${pkg_config}" | ||
DESTINATION "${pkgconfig_install_dir}" | ||
) | ||
|
||
# install targets config file | ||
install( | ||
EXPORT "${targets_export_name}" | ||
NAMESPACE "${namespace}" | ||
DESTINATION "${config_install_dir}" | ||
FILE ${targets_config} | ||
) | ||
|
||
# export build directory targets file | ||
export( | ||
EXPORT ${targets_export_name} | ||
NAMESPACE "${namespace}" | ||
FILE ${targets_config} | ||
) | ||
|
||
# register project in CMake user registry | ||
export(PACKAGE ${PROJECT_NAME}) | ||
|
||
file(GLOB_RECURSE spdlog_include_SRCS "${HEADER_BASE}/*.h") | ||
add_custom_target(spdlog_headers_for_ide SOURCES ${spdlog_include_SRCS}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# *************************************************************************/ | ||
# * Copyright (c) 2015 Ruslan Baratov. */ | ||
# * */ | ||
# * Permission is hereby granted, free of charge, to any person obtaining */ | ||
# * a copy of this software and associated documentation files (the */ | ||
# * "Software"), to deal in the Software without restriction, including */ | ||
# * without limitation the rights to use, copy, modify, merge, publish, */ | ||
# * distribute, sublicense, and/or sell copies of the Software, and to */ | ||
# * permit persons to whom the Software is furnished to do so, subject to */ | ||
# * the following conditions: */ | ||
# * */ | ||
# * The above copyright notice and this permission notice shall be */ | ||
# * included in all copies or substantial portions of the Software. */ | ||
# * */ | ||
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ | ||
# * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ | ||
# * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | ||
# * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ | ||
# * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ | ||
# * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ | ||
# * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ | ||
# *************************************************************************/ | ||
|
||
set(SPDLOG_FMT_EXTERNAL @SPDLOG_FMT_EXTERNAL@) | ||
|
||
include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake") | ||
|
||
if(SPDLOG_FMT_EXTERNAL) | ||
include(CMakeFindDependencyMacro) | ||
find_dependency(fmt CONFIG) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
if(SPDLOG_SANITIZE_THREAD AND SPDLOG_SANITIZE_ADDRESS) | ||
message(FATAL_ERROR "AddressSanitizer is not compatible with ThreadSanitizer.") | ||
endif() | ||
|
||
if(SPDLOG_SANITIZE_ADDRESS) | ||
message(STATUS "AddressSanitizer enabled") | ||
set(SANITIZER_FLAGS "-fsanitize=address,undefined") | ||
add_compile_options("-fno-sanitize=signed-integer-overflow") | ||
endif() | ||
|
||
if(SPDLOG_SANITIZE_THREAD) | ||
message(STATUS "ThreadSanitizer enabled") | ||
set(SANITIZER_FLAGS "-fsanitize=thread") | ||
endif() | ||
|
||
if(SPDLOG_SANITIZE_THREAD OR SPDLOG_SANITIZE_ADDRESS) | ||
add_compile_options(${SANITIZER_FLAGS}) | ||
add_compile_options("-fno-sanitize-recover=all") | ||
add_compile_options("-fno-omit-frame-pointer") | ||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_FLAGS} -fuse-ld=gold") | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
prefix=@CMAKE_INSTALL_PREFIX@ | ||
includedir=${prefix}/include | ||
|
||
Name: @PROJECT_NAME@ | ||
Description: Super fast C++ logging library. | ||
Version: @PROJECT_VERSION@ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
|
||
// | ||
// Copyright(c) 2018 Gabi Melman. | ||
// Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||
// | ||
|
||
#pragma once | ||
|
||
// | ||
// Async logging using global thread pool | ||
// All loggers created here share same global thread pool. | ||
// Each log message is pushed to a queue along withe a shared pointer to the | ||
// logger. | ||
// If a logger deleted while having pending messages in the queue, it's actual | ||
// destruction will defer | ||
// until all its messages are processed by the thread pool. | ||
// This is because each message in the queue holds a shared_ptr to the | ||
// originating logger. | ||
|
||
#include "spdlog/async_logger.h" | ||
#include "spdlog/details/registry.h" | ||
#include "spdlog/details/thread_pool.h" | ||
|
||
#include <memory> | ||
#include <mutex> | ||
|
||
namespace spdlog { | ||
|
||
namespace details { | ||
static const size_t default_async_q_size = 8192; | ||
} | ||
|
||
// async logger factory - creates async loggers backed with thread pool. | ||
// if a global thread pool doesn't already exist, create it with default queue | ||
// size of 8192 items and single thread. | ||
template<async_overflow_policy OverflowPolicy = async_overflow_policy::block> | ||
struct async_factory_impl | ||
{ | ||
template<typename Sink, typename... SinkArgs> | ||
static std::shared_ptr<async_logger> create(std::string logger_name, SinkArgs &&... args) | ||
{ | ||
auto ®istry_inst = details::registry::instance(); | ||
|
||
// create global thread pool if not already exists.. | ||
std::lock_guard<std::recursive_mutex> tp_lock(registry_inst.tp_mutex()); | ||
auto tp = registry_inst.get_tp(); | ||
if (tp == nullptr) | ||
{ | ||
tp = std::make_shared<details::thread_pool>(details::default_async_q_size, 1); | ||
registry_inst.set_tp(tp); | ||
} | ||
|
||
auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...); | ||
auto new_logger = std::make_shared<async_logger>(std::move(logger_name), std::move(sink), std::move(tp), OverflowPolicy); | ||
registry_inst.initialize_logger(new_logger); | ||
return new_logger; | ||
} | ||
}; | ||
|
||
using async_factory = async_factory_impl<async_overflow_policy::block>; | ||
using async_factory_nonblock = async_factory_impl<async_overflow_policy::overrun_oldest>; | ||
|
||
template<typename Sink, typename... SinkArgs> | ||
inline std::shared_ptr<spdlog::logger> create_async(std::string logger_name, SinkArgs &&... sink_args) | ||
{ | ||
return async_factory::create<Sink>(std::move(logger_name), std::forward<SinkArgs>(sink_args)...); | ||
} | ||
|
||
template<typename Sink, typename... SinkArgs> | ||
inline std::shared_ptr<spdlog::logger> create_async_nb(std::string logger_name, SinkArgs &&... sink_args) | ||
{ | ||
return async_factory_nonblock::create<Sink>(std::move(logger_name), std::forward<SinkArgs>(sink_args)...); | ||
} | ||
|
||
// set global thread pool. | ||
inline void init_thread_pool(size_t q_size, size_t thread_count) | ||
{ | ||
auto tp = std::make_shared<details::thread_pool>(q_size, thread_count); | ||
details::registry::instance().set_tp(std::move(tp)); | ||
} | ||
|
||
// get the global thread pool. | ||
inline std::shared_ptr<spdlog::details::thread_pool> thread_pool() | ||
{ | ||
return details::registry::instance().get_tp(); | ||
} | ||
} // namespace spdlog |
73 changes: 73 additions & 0 deletions
73
share/openPMD/thirdParty/spdlog/include/spdlog/async_logger.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
// | ||
// Copyright(c) 2015 Gabi Melman. | ||
// Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||
// | ||
|
||
#pragma once | ||
|
||
// Very fast asynchronous logger (millions of logs per second on an average | ||
// desktop) | ||
// Uses pre allocated lockfree queue for maximum throughput even under large | ||
// number of threads. | ||
// Creates a single back thread to pop messages from the queue and log them. | ||
// | ||
// Upon each log write the logger: | ||
// 1. Checks if its log level is enough to log the message | ||
// 2. Push a new copy of the message to a queue (or block the caller until | ||
// space is available in the queue) | ||
// 3. will throw spdlog_ex upon log exceptions | ||
// Upon destruction, logs all remaining messages in the queue before | ||
// destructing.. | ||
|
||
#include "spdlog/common.h" | ||
#include "spdlog/logger.h" | ||
|
||
#include <chrono> | ||
#include <memory> | ||
#include <string> | ||
|
||
namespace spdlog { | ||
|
||
// Async overflow policy - block by default. | ||
enum class async_overflow_policy | ||
{ | ||
block, // Block until message can be enqueued | ||
overrun_oldest // Discard oldest message in the queue if full when trying to | ||
// add new item. | ||
}; | ||
|
||
namespace details { | ||
class thread_pool; | ||
} | ||
|
||
class async_logger final : public std::enable_shared_from_this<async_logger>, public logger | ||
{ | ||
friend class details::thread_pool; | ||
|
||
public: | ||
template<typename It> | ||
async_logger(std::string logger_name, It begin, It end, std::weak_ptr<details::thread_pool> tp, | ||
async_overflow_policy overflow_policy = async_overflow_policy::block); | ||
|
||
async_logger(std::string logger_name, sinks_init_list sinks_list, std::weak_ptr<details::thread_pool> tp, | ||
async_overflow_policy overflow_policy = async_overflow_policy::block); | ||
|
||
async_logger(std::string logger_name, sink_ptr single_sink, std::weak_ptr<details::thread_pool> tp, | ||
async_overflow_policy overflow_policy = async_overflow_policy::block); | ||
|
||
std::shared_ptr<logger> clone(std::string new_name) override; | ||
|
||
protected: | ||
void sink_it_(details::log_msg &msg) override; | ||
void flush_() override; | ||
|
||
void backend_log_(const details::log_msg &incoming_log_msg); | ||
void backend_flush_(); | ||
|
||
private: | ||
std::weak_ptr<details::thread_pool> thread_pool_; | ||
async_overflow_policy overflow_policy_; | ||
}; | ||
} // namespace spdlog | ||
|
||
#include "details/async_logger_impl.h" |
Oops, something went wrong.