From 336e342c14863e971a4b392384a1b986001861ee Mon Sep 17 00:00:00 2001 From: selim Date: Sun, 24 Aug 2014 21:12:21 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA,=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=20log=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83=D0=B5=D1=82?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D1=83=20=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D1=89=D0=B0=D0=B5=D1=82=20=D0=B5=D0=B5=20=D0=B2=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D1=8C=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/log_queue.h | 27 +++++++++++++++++++++++++++ include/logger.h | 3 +++ src/log_queue.cpp | 33 +++++++++++++++++++++++++++++++++ src/logger.cpp | 2 +- test/main.cpp | 3 +++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 include/log_queue.h create mode 100644 src/log_queue.cpp diff --git a/include/log_queue.h b/include/log_queue.h new file mode 100644 index 0000000..1c8ba7a --- /dev/null +++ b/include/log_queue.h @@ -0,0 +1,27 @@ +#ifndef LOG_QUEUE_H +#define LOG_QUEUE_H + +#include +#include +#include +#include + +class log_queue +{ +private: + std::thread _worker; + std::mutex _mutex; + std::condition_variable _cond; + std::queue _queue; + +private: + void worker_func(); + +public: + log_queue(); + ~log_queue(); + void add_log(const std::string& logLine); +}; + +#endif /* LOG_QUEUE_H */ + diff --git a/include/logger.h b/include/logger.h index 9ffc694..ef6c106 100644 --- a/include/logger.h +++ b/include/logger.h @@ -1,6 +1,8 @@ #ifndef _LOGGER_H_ #define _LOGGER_H_ +#include "log_queue.h" + #include #include #include @@ -10,6 +12,7 @@ class logger { private: std::stringstream _logLine; + log_queue _queue; public: logger(); diff --git a/src/log_queue.cpp b/src/log_queue.cpp new file mode 100644 index 0000000..9132850 --- /dev/null +++ b/src/log_queue.cpp @@ -0,0 +1,33 @@ +#include "log_queue.h" +#include + +log_queue::log_queue(): _worker(&log_queue::worker_func, this) +{ +} + +log_queue::~log_queue() +{ + _worker.join(); +} + +void log_queue::worker_func() +{ + while(true) + { + std::unique_lock lock(_mutex); + _cond.wait(lock, [this] { return !_queue.empty(); }); + std::string line = _queue.front(); + _queue.pop(); + lock.unlock(); + + // actually logging + std::cout << line << std::endl; + } +} + +void log_queue::add_log(const std::string& logLine) +{ + std::lock_guard lock(_mutex); + _queue.push(logLine); + _cond.notify_one(); +} \ No newline at end of file diff --git a/src/logger.cpp b/src/logger.cpp index 5a85b7f..013f1f3 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -17,6 +17,6 @@ void logger::log_internal(const char *s) _logLine << *s++; } - std::cout << _logLine.str() << std::endl; + _queue.add_log(_logLine.str()); } diff --git a/test/main.cpp b/test/main.cpp index 3f9d962..892e3a8 100755 --- a/test/main.cpp +++ b/test/main.cpp @@ -571,5 +571,8 @@ int main(int argc, char **argv) ulog.log("one: %, two: %", one, two); ulog.log("Hello world!"); + int i = 0; + std::cin >> i; + return 0; }