diff --git a/examples/c++/logger.cxx b/examples/c++/logger.cxx index b4b1c0b4..2d86ccba 100644 --- a/examples/c++/logger.cxx +++ b/examples/c++/logger.cxx @@ -1,16 +1,34 @@ +#include +#include + #include "upm_logger.hpp" using namespace upm; +void print() +{ + UPM_LOG(LOG_DEBUG) << "Thread " << std::this_thread::get_id() << ": running loop with 3 iterations"; + + for (int i = 0; i < 4; ++i) { + UPM_LOG(LOG_DEBUG) << std::this_thread::get_id() << ": i = " << i; + } +} + int main() { + std::vector threads; UPM_LOGGER::LogLevel() = LOG_INFO; - UPM_LOG(LOG_WARNING) << "a loop with 4 iterations"; + UPM_LOG(LOG_WARNING) << "Testing the upm logger"; - for (int i = 0; i < 4; ++i) { - UPM_LOG(LOG_DEBUG) << "i = " << i; + // Launching 5 threads + for (int i = 0; i < 5; ++i) { + threads.push_back(std::thread(print)); + } + + for (auto& thread : threads) { + thread.join(); } return 0; diff --git a/include/upm_logger.hpp b/include/upm_logger.hpp index 941a2ec1..71cbe1a1 100644 --- a/include/upm_logger.hpp +++ b/include/upm_logger.hpp @@ -1,3 +1,27 @@ +/* + * Author: Mihai Stefanescu + * Copyright (c) 2018 Intel Corporation. + * + * 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. + */ + #pragma once #include @@ -38,13 +62,10 @@ namespace upm { class UPM_LOGGER { public: - UPM_LOGGER(); + UPM_LOGGER() {} virtual ~UPM_LOGGER(); std::ostringstream& log(UpmLogLevel level = LOG_ERROR); static UpmLogLevel& LogLevel(); - - static std::ofstream logStream; - static std::mutex logMutex; protected: std::ostringstream os; private: @@ -53,32 +74,33 @@ namespace upm { private: // Track logLevel for this particular instance of UPM_LOGGER UpmLogLevel logLevel; - + std::ofstream logStream; + static std::mutex logMutex; public: - static const std::string& getLogLevelName(UpmLogLevel level) - { - if (level < LOG_ERROR || level >= NA) { - return NULL; - } - - return logLevelNames[level]; - } - - public: - static void write(std::ostringstream& os) - { - - - std::lock_guard lock(logMutex); - - logStream.open(LOG_FILE, std::ios_base::app); - logStream << os.str(); - logStream.flush(); - } + static const std::string& getLogLevelName(UpmLogLevel level); + private: + void write(std::ostringstream& os); }; - UPM_LOGGER::UPM_LOGGER() {} + std::mutex UPM_LOGGER::logMutex; + void UPM_LOGGER::write(std::ostringstream& os) + { + std::lock_guard lock(logMutex); + + logStream.open(LOG_FILE, std::ios_base::app); + logStream << os.str(); + logStream.flush(); + } + + const std::string& UPM_LOGGER::getLogLevelName(UpmLogLevel level) + { + if (level < LOG_ERROR || level >= NA) { + return NULL; + } + + return logLevelNames[level]; + } UpmLogLevel& UPM_LOGGER::LogLevel() {