LCOV - code coverage report
Current view: top level - libs/logger - logger_manager.cpp (source / functions) Hit Total Coverage
Test: cleared_cor.info Lines: 26 39 66.7 %
Date: 2019-03-07 14:46:43 Functions: 10 11 90.9 %

          Line data    Source code
       1             : /**
       2             :  * Copyright Soramitsu Co., Ltd. All Rights Reserved.
       3             :  * SPDX-License-Identifier: Apache-2.0
       4             :  */
       5             : 
       6             : #include "logger/logger_manager.hpp"
       7             : 
       8             : #include <atomic>
       9             : 
      10             : static const std::string kTagHierarchySeparator = "/";
      11             : 
      12             : static inline std::string joinTags(const std::string &parent,
      13             :                                    const std::string &child) {
      14        1745 :   return parent.empty() ? child : parent + kTagHierarchySeparator + child;
      15           0 : }
      16             : 
      17             : namespace logger {
      18             : 
      19             :   LoggerManagerTree::LoggerManagerTree(ConstLoggerConfigPtr config)
      20           1 :       : config_(std::move(config)){};
      21             : 
      22             :   LoggerManagerTree::LoggerManagerTree(LoggerConfig config)
      23          82 :       : config_(std::make_shared<const LoggerConfig>(std::move(config))){};
      24             : 
      25             :   LoggerManagerTree::LoggerManagerTree(std::string full_tag,
      26             :                                        std::string node_tag,
      27             :                                        ConstLoggerConfigPtr config)
      28        1745 :       : node_tag_(std::move(node_tag)),
      29        1745 :         full_tag_(std::move(full_tag)),
      30        1745 :         config_(std::move(config)){};
      31             : 
      32             :   LoggerManagerTreePtr LoggerManagerTree::registerChild(
      33             :       std::string tag,
      34             :       boost::optional<LogLevel> log_level,
      35             :       boost::optional<LogPatterns> patterns) {
      36           0 :     LoggerConfig child_config{
      37           0 :         log_level.value_or(config_->log_level),
      38           0 :         patterns ? LogPatterns{*std::move(patterns)} : config_->patterns};
      39             :     // Operator new is employed due to private visibility of used constructor.
      40           0 :     LoggerManagerTreePtr child(new LoggerManagerTree(
      41           0 :         joinTags(full_tag_, tag),
      42           0 :         tag,
      43           0 :         std::make_shared<const LoggerConfig>(std::move(child_config))));
      44           0 :     auto map_elem = std::make_pair<const std::string, LoggerManagerTreePtr>(
      45           0 :         std::move(tag), std::move(child));
      46           0 :     std::lock_guard<std::mutex> lock(children_mutex_);
      47           0 :     return children_.emplace(std::move(map_elem)).first->second;
      48           0 :   }
      49             : 
      50             :   LoggerPtr LoggerManagerTree::getLogger() {
      51             :     LoggerPtr logger =
      52       33147 :         std::atomic_load_explicit(&logger_, std::memory_order_acquire);
      53       33147 :     if (not logger) {
      54        1499 :       LoggerPtr new_logger = std::make_shared<LoggerSpdlog>(full_tag_, config_);
      55        1502 :       while (not logger) {
      56        1499 :         if (std::atomic_compare_exchange_weak_explicit(
      57        1499 :                 &logger_,
      58             :                 &logger,
      59        1499 :                 new_logger,
      60             :                 std::memory_order_release,
      61             :                 std::memory_order_acquire)) {
      62        1496 :           return new_logger;
      63             :         }
      64             :       }
      65        1499 :     }
      66       31651 :     return logger;
      67       33147 :   }
      68             : 
      69             :   LoggerManagerTreePtr LoggerManagerTree::getChild(const std::string &tag) {
      70       34650 :     std::lock_guard<std::mutex> lock(children_mutex_);
      71       34709 :     const auto child_it = children_.find(tag);
      72       34710 :     if (child_it != children_.end()) {
      73       32965 :       return child_it->second;
      74             :     }
      75             :     // If a node for this child is not found in the tree config, create a
      76             :     // new standalone logger using this logger's settings.
      77        1745 :     LoggerManagerTreePtr new_child(
      78        1745 :         new LoggerManagerTree(joinTags(full_tag_, tag), tag, config_));
      79        1745 :     return children_.emplace(std::make_pair(tag, std::move(new_child)))
      80        1745 :         .first->second;
      81       34710 :   }
      82             : 
      83             : }  // namespace logger

Generated by: LCOV version 1.13