diff --git a/src/cpp/garbage-collector.cpp b/src/cpp/garbage-collector.cpp index 25d943b..b51154f 100644 --- a/src/cpp/garbage-collector.cpp +++ b/src/cpp/garbage-collector.cpp @@ -40,7 +40,8 @@ void GC::collect() { } // Sweep phase - DEBUG << "Removing " << (objects_.size() - black.size()) << " out of " << objects_.size() << std::endl; + DEBUG("gc") << "Removing " << (objects_.size() - black.size()) + << " out of " << objects_.size() << std::endl; objects_ = std::move(black); lastCleanup_.store(std::max(objects_.size(), MINIMUN_SIZE_LEFT)); diff --git a/src/cpp/logger.cpp b/src/cpp/logger.cpp new file mode 100644 index 0000000..8bde8bf --- /dev/null +++ b/src/cpp/logger.cpp @@ -0,0 +1,34 @@ +#include "logger.h" + +#include +#include +#include +#include + + +namespace effil { + +static std::unique_ptr getLoggerStream() { + const char* logFile = getenv("EFFIL_LOG"); + + if (logFile == nullptr) { + return std::make_unique(nullptr); + } + else if (strcmp(logFile, "term") == 0) { + return std::make_unique(std::cout.rdbuf()); + } + return std::make_unique(logFile); +} + +std::mutex Logger::lock_; +std::unique_ptr Logger::stream_(getLoggerStream()); + +std::string getCurrentTime() { + const auto currTime = std::time(nullptr); + const auto tm = std::localtime(&currTime); + std::stringstream ss; + ss << std::put_time(tm, "%F %T"); + return ss.str(); +} + +} // namespace effil diff --git a/src/cpp/logger.h b/src/cpp/logger.h new file mode 100644 index 0000000..1a64eee --- /dev/null +++ b/src/cpp/logger.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace effil { + +class Logger +{ +public: + Logger() + : lockGuard_(lock_) + {} + + ~Logger() { + *stream_ << std::endl; + } + + std::ostream& getStream() { return *stream_; } + +private: + static std::mutex lock_; + static std::unique_ptr stream_; + + std::lock_guard lockGuard_; +}; + +std::string getCurrentTime(); + +#ifdef NDEBUG +# define DEBUG(x) if (false) std::cout +#else +# define DEBUG(name) Logger().getStream() << getCurrentTime() \ + << " " << "[" << std::this_thread::get_id() \ + << "][" << name << "] " +#endif + +} // effil diff --git a/src/cpp/threading.cpp b/src/cpp/threading.cpp index d3fddfc..ed8fc01 100644 --- a/src/cpp/threading.cpp +++ b/src/cpp/threading.cpp @@ -144,7 +144,7 @@ void Thread::runThread(Thread thread, } catch (const LuaHookStopException&) { thread.ctx_->changeStatus(Status::Canceled); } catch (const sol::error& err) { - DEBUG << "Failed with msg: " << err.what() << std::endl; + DEBUG("thread") << "Failed with msg: " << err.what() << std::endl; auto& returns = thread.ctx_->result(); returns.insert(returns.begin(), { createStoredObject("failed"), diff --git a/src/cpp/utils.h b/src/cpp/utils.h index b9b1656..116cec1 100644 --- a/src/cpp/utils.h +++ b/src/cpp/utils.h @@ -1,9 +1,8 @@ #pragma once -#include -#include -#include +#include "logger.h" +#include #include #if LUA_VERSION_NUM < 501 || LUA_VERSION_NUM > 503 @@ -52,13 +51,10 @@ private: std::function f_; }; -} // effil - #define REQUIRE(cond) if (!(cond)) throw effil::Exception() -#define RETHROW_WITH_PREFIX(preff) catch(const effil::Exception& err) { throw effil::Exception() << preff << ": " << err.what(); } +#define RETHROW_WITH_PREFIX(preff) catch(const effil::Exception& err) { \ + DEBUG(preff) << err.what(); \ + throw effil::Exception() << preff << ": " << err.what(); \ + } -#ifdef NDEBUG -#define DEBUG if (false) std::cout -#else -#define DEBUG std::cout << __FILE__ << ":" << __FUNCTION__ << ":" << __LINE__ << " tid:" << std::this_thread::get_id() << " " -#endif +} // namespace effil