#ifndef RTLogger_hpp #define RTLogger_hpp #include #include #include #include #include #include class RTLogger { public: static RTLogger& get(); static void log(const char* format, ...); private: struct message { message(std::string && s) noexcept: shouldExit(false), val(std::move(s)) { } message() noexcept: shouldExit(true) { } bool shouldExit; std::string val; }; RTLogger(); ~RTLogger(); RTLogger(const RTLogger&) = delete; void start(); void stop(); std::unique_ptr thread; rigtorp::MPMCQueue q; std::counting_semaphore<1024> sema; static std::atomic instance; static_assert(decltype(instance)::is_always_lock_free); friend class RTLoggerThread; }; #endif /* RTLogger_hpp */