// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "td/utils/common.h" #include "td/utils/logging.h" #include "td/utils/Slice.h" #include <atomic> namespace td { class TsLog final : public LogInterface { public: explicit TsLog(LogInterface *log) : log_(log) { } void init(LogInterface *log) { enter_critical(); log_ = log; exit_critical(); } void after_rotation() final { enter_critical(); log_->after_rotation(); exit_critical(); } vector<string> get_file_paths() final { enter_critical(); auto result = log_->get_file_paths(); exit_critical(); return result; } private: void do_append(int log_level, CSlice slice) final { enter_critical(); log_->do_append(log_level, slice); exit_critical(); } void enter_critical(); void exit_critical() { lock_.clear(std::memory_order_release); } LogInterface *log_ = nullptr; std::atomic_flag lock_ = ATOMIC_FLAG_INIT; }; } // namespace td