diff --git a/example/example.cpp b/example/example.cpp index 81398caf..3a8a21e2 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -17,13 +17,13 @@ using namespace utils; int main(int argc, char* argv[]) { - + const unsigned int howmany = argc <= 1 ? 1000000:atoi(argv[1]); logger cout_logger ("", sinks::stdout_sink()); cout_logger.set_min_level(c11log::level::TRACE); cout_logger.info() << "Hello " << "man" << 123; - cout_logger.trace("This is very nice! ") << "Yes gabi.." << ":)"; + auto fsink = std::make_shared("log", "txt", 1024*1024*50 , 5, 0); auto nullsink = sinks::null_sink::get(); @@ -35,16 +35,14 @@ int main(int argc, char* argv[]) auto start = system_clock::now(); for(unsigned int i = 1; i <= howmany ; ++i) - my_logger.info("Hello logger: ") << 4.5 << 123 << "asdasd" << 123 << 'f'; + my_logger.info("Hello logger: ") << 4.5 <<'\t' << i << "\tasdasd:" << 123 << 'f'; - //auto s = howmany - as->q().size(); - auto s = howmany; auto delta = system_clock::now() - start; auto delta_d = duration_cast> (delta).count(); - cout_logger.info("Total:") << format(s); + cout_logger.info("Total:") << format(howmany); cout_logger.info("Delta:") << format(delta_d); - cout_logger.info("Rate:") << format(s/delta_d) << "/sec"; + cout_logger.info("Rate:") << format(howmany/delta_d) << "/sec"; return 0; } diff --git a/include/c11log/details/line_logger.h b/include/c11log/details/line_logger.h index 2458499b..6183c509 100644 --- a/include/c11log/details/line_logger.h +++ b/include/c11log/details/line_logger.h @@ -39,18 +39,23 @@ public: line_logger& operator=(const line_logger&) = delete; line_logger& operator=(line_logger&&) = delete; + line_logger(line_logger&& other) : _callback_logger(other._callback_logger), - _log_msg(other._log_msg), - // The move ctor should only be called on start of logging line, - // where no logging happened yet for this line so no need to copy the oss from the other - _oss(), - _enabled(other._enabled) {} + _log_msg(std::move(other._log_msg)), + _oss(std::move(other._oss)), + _enabled(other._enabled), + _empty(other._empty) + { + other.disable(); + } + + ~line_logger() { //only if enabled and not empty - if (!_empty) + if (_enabled && !_empty) { _oss << os::eol(); _log_msg.msg_buf = _oss.buf(); @@ -75,6 +80,11 @@ public: return *this; } + void disable() + { + _enabled = false; + } + private: diff --git a/include/c11log/details/log_msg.h b/include/c11log/details/log_msg.h index 7233ee25..4eb3ee87 100644 --- a/include/c11log/details/log_msg.h +++ b/include/c11log/details/log_msg.h @@ -7,15 +7,8 @@ namespace details struct log_msg { log_msg() = default; - log_msg(level::level_enum l):msg_level(l) {}; - log_msg(const log_msg& other) - { - msg_buf = other.msg_buf; - msg_time = other.msg_time; - msg_header_size = other.msg_header_size; - msg_level = other.msg_level; - } - + log_msg(level::level_enum l):msg_level(l) {}; + bufpair_t msg_buf; log_clock::time_point msg_time; std::size_t msg_header_size; diff --git a/include/c11log/details/stack_buf.h b/include/c11log/details/stack_buf.h index 1d2b1dbd..bfe9d619 100644 --- a/include/c11log/details/stack_buf.h +++ b/include/c11log/details/stack_buf.h @@ -8,7 +8,6 @@ // Fast memory storage // stores its contents on the stack when possible, in vector otherwise // NOTE: User should be remember that returned buffer might be on the stack!! - namespace c11log { namespace details @@ -18,9 +17,12 @@ template class stack_buf { public: - stack_buf():_stack_size(0) {} + stack_buf():_v(),_stack_buf(), _stack_size(0) {} ~stack_buf() {}; + stack_buf& operator=(const stack_buf other) = delete; + stack_buf& operator=(stack_buf&& other) = delete; + stack_buf(const bufpair_t& buf_to_copy):stack_buf() { append(buf_to_copy); @@ -36,18 +38,15 @@ public: } stack_buf(stack_buf&& other) - { + { _stack_size = other._stack_size; if(!other._v.empty()) - _v = other._v; + _v = std::move(other._v); else if(_stack_size) std::copy(other._stack_buf.begin(), other._stack_buf.begin()+_stack_size, _stack_buf.begin()); - other.clear(); + other.clear(); } - - stack_buf& operator=(const stack_buf& other) = delete; - stack_buf& operator=(stack_buf&& other) = delete; - + void append(const char* buf, std::size_t buf_size) { //If we are aleady using _v, forget about the stack diff --git a/include/c11log/details/stack_oss.h b/include/c11log/details/stack_oss.h index ccb6bb2c..ffdb07f5 100644 --- a/include/c11log/details/stack_oss.h +++ b/include/c11log/details/stack_oss.h @@ -16,10 +16,15 @@ public: stack_devicebuf() = default; ~stack_devicebuf() = default; - stack_devicebuf(const stack_devicebuf& other) = delete; - stack_devicebuf(stack_devicebuf&& other) = delete; - stack_devicebuf& operator=(const stack_devicebuf&) = delete; - stack_devicebuf& operator=(stack_devicebuf&&) = delete; + stack_devicebuf& operator=(const stack_devicebuf&) = delete; + + stack_devicebuf(const stack_devicebuf& other):std::basic_streambuf(),_stackbuf(other._stackbuf) + {} + + stack_devicebuf(stack_devicebuf&& other):std::basic_streambuf(),_stackbuf(std::move(other._stackbuf)) + { + other.clear(); + } bufpair_t buf() const { @@ -63,9 +68,16 @@ public: stack_oss():std::ostream(&_dev) {} ~stack_oss() = default; - stack_oss(const stack_oss& other) = delete; - stack_oss(stack_oss&& other) = delete; - stack_oss& operator=(const stack_oss& other) = delete; + stack_oss& operator=(const stack_oss& other) = delete; + stack_oss& operator=(const stack_oss&& other) = delete; + + stack_oss(const stack_oss& other):std::basic_ios(), std::ostream(&_dev), _dev(other._dev) + {} + + stack_oss(stack_oss&& other):std::basic_ios(), std::ostream(&_dev), _dev(std::move(other._dev)) + { + other.clear(); + } bufpair_t buf() const { diff --git a/include/c11log/sinks/async_sink.h b/include/c11log/sinks/async_sink.h index 090bbce6..4bd22d38 100644 --- a/include/c11log/sinks/async_sink.h +++ b/include/c11log/sinks/async_sink.h @@ -29,7 +29,7 @@ class async_sink : public base_sink public: - using queue_type = c11log::details::blocking_queue>>; + using queue_type = details::blocking_queue>>; explicit async_sink(const queue_type::size_type max_queue_size); @@ -82,7 +82,7 @@ inline void c11log::sinks::async_sink::_sink_it(const details::log_msg& msg) if(!_active || !msg_size) return; //re allocate on the heap the (stack based) message - auto new_msg = new details::log_msg(msg); + details::log_msg* new_msg = new details::log_msg(msg); char *buf = new char[msg_size]; std::memcpy(buf, msg.msg_buf.first, msg_size);