Disable logging after program exit.
GitOrigin-RevId: 8ca24e1999fe95f171e18477baa2e56912a2e895
This commit is contained in:
parent
a67225d358
commit
10a7edfbea
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include "td/actor/actor.h"
|
#include "td/actor/actor.h"
|
||||||
|
|
||||||
|
#include "td/utils/ExitGuard.h"
|
||||||
#include "td/utils/FileLog.h"
|
#include "td/utils/FileLog.h"
|
||||||
#include "td/utils/logging.h"
|
#include "td/utils/logging.h"
|
||||||
#include "td/utils/misc.h"
|
#include "td/utils/misc.h"
|
||||||
@ -44,6 +45,7 @@ static std::mutex logging_mutex;
|
|||||||
static FileLog file_log;
|
static FileLog file_log;
|
||||||
static TsLog ts_log(&file_log);
|
static TsLog ts_log(&file_log);
|
||||||
static NullLog null_log;
|
static NullLog null_log;
|
||||||
|
static ExitGuard exit_guard;
|
||||||
|
|
||||||
#define ADD_TAG(tag) \
|
#define ADD_TAG(tag) \
|
||||||
{ #tag, &VERBOSITY_NAME(tag) }
|
{ #tag, &VERBOSITY_NAME(tag) }
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "td/utils/buffer.h"
|
#include "td/utils/buffer.h"
|
||||||
#include "td/utils/common.h"
|
#include "td/utils/common.h"
|
||||||
#include "td/utils/crypto.h"
|
#include "td/utils/crypto.h"
|
||||||
|
#include "td/utils/ExitGuard.h"
|
||||||
#include "td/utils/FileLog.h"
|
#include "td/utils/FileLog.h"
|
||||||
#include "td/utils/format.h"
|
#include "td/utils/format.h"
|
||||||
#include "td/utils/JsonBuilder.h"
|
#include "td/utils/JsonBuilder.h"
|
||||||
@ -4442,6 +4443,7 @@ static void on_fatal_error(const char *error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void main(int argc, char **argv) {
|
void main(int argc, char **argv) {
|
||||||
|
ExitGuard exit_guard;
|
||||||
ignore_signal(SignalType::HangUp).ensure();
|
ignore_signal(SignalType::HangUp).ensure();
|
||||||
ignore_signal(SignalType::Pipe).ensure();
|
ignore_signal(SignalType::Pipe).ensure();
|
||||||
set_signal_handler(SignalType::Error, fail_signal).ensure();
|
set_signal_handler(SignalType::Error, fail_signal).ensure();
|
||||||
|
@ -6,8 +6,15 @@
|
|||||||
//
|
//
|
||||||
#include "td/utils/ExitGuard.h"
|
#include "td/utils/ExitGuard.h"
|
||||||
|
|
||||||
|
#include "td/utils/logging.h"
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
std::atomic<bool> ExitGuard::is_exited_{false};
|
std::atomic<bool> ExitGuard::is_exited_{false};
|
||||||
|
|
||||||
|
ExitGuard::~ExitGuard() {
|
||||||
|
is_exited_.store(true, std::memory_order_relaxed);
|
||||||
|
set_verbosity_level(VERBOSITY_NAME(FATAL));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -17,9 +17,7 @@ class ExitGuard {
|
|||||||
ExitGuard &operator=(ExitGuard &&) = delete;
|
ExitGuard &operator=(ExitGuard &&) = delete;
|
||||||
ExitGuard(const ExitGuard &) = delete;
|
ExitGuard(const ExitGuard &) = delete;
|
||||||
ExitGuard &operator=(const ExitGuard &) = delete;
|
ExitGuard &operator=(const ExitGuard &) = delete;
|
||||||
~ExitGuard() {
|
~ExitGuard();
|
||||||
is_exited_.store(true, std::memory_order_relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool is_exited() {
|
static bool is_exited() {
|
||||||
return is_exited_.load(std::memory_order_relaxed);
|
return is_exited_.load(std::memory_order_relaxed);
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
#include "td/utils/logging.h"
|
#include "td/utils/logging.h"
|
||||||
|
|
||||||
|
#include "td/utils/ExitGuard.h"
|
||||||
#include "td/utils/port/Clocks.h"
|
#include "td/utils/port/Clocks.h"
|
||||||
#include "td/utils/port/StdStreams.h"
|
#include "td/utils/port/StdStreams.h"
|
||||||
#include "td/utils/port/thread_local.h"
|
#include "td/utils/port/thread_local.h"
|
||||||
@ -43,6 +44,9 @@ Logger::Logger(LogInterface &log, const LogOptions &options, int log_level, Slic
|
|||||||
if (!options_.add_info) {
|
if (!options_.add_info) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (ExitGuard::is_exited()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// log level
|
// log level
|
||||||
sb_ << '[';
|
sb_ << '[';
|
||||||
@ -104,6 +108,9 @@ Logger::Logger(LogInterface &log, const LogOptions &options, int log_level, Slic
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logger::~Logger() {
|
Logger::~Logger() {
|
||||||
|
if (ExitGuard::is_exited()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (options_.fix_newlines) {
|
if (options_.fix_newlines) {
|
||||||
sb_ << '\n';
|
sb_ << '\n';
|
||||||
auto slice = as_cslice();
|
auto slice = as_cslice();
|
||||||
@ -152,7 +159,7 @@ TsCerr &TsCerr::operator<<(Slice slice) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TsCerr::enterCritical() {
|
void TsCerr::enterCritical() {
|
||||||
while (lock_.test_and_set(std::memory_order_acquire)) {
|
while (lock_.test_and_set(std::memory_order_acquire) && !ExitGuard::is_exited()) {
|
||||||
// spin
|
// spin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,6 +169,16 @@ void TsCerr::exitCritical() {
|
|||||||
}
|
}
|
||||||
TsCerr::Lock TsCerr::lock_ = ATOMIC_FLAG_INIT;
|
TsCerr::Lock TsCerr::lock_ = ATOMIC_FLAG_INIT;
|
||||||
|
|
||||||
|
void TsLog::enter_critical() {
|
||||||
|
while (lock_.test_and_set(std::memory_order_acquire) && !ExitGuard::is_exited()) {
|
||||||
|
// spin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TsLog::exit_critical() {
|
||||||
|
lock_.clear(std::memory_order_release);
|
||||||
|
}
|
||||||
|
|
||||||
class DefaultLog : public LogInterface {
|
class DefaultLog : public LogInterface {
|
||||||
public:
|
public:
|
||||||
void append(CSlice slice, int log_level) override {
|
void append(CSlice slice, int log_level) override {
|
||||||
@ -290,4 +307,6 @@ ScopedDisableLog::~ScopedDisableLog() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ExitGuard exit_guard;
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -321,14 +321,8 @@ class TsLog : public LogInterface {
|
|||||||
private:
|
private:
|
||||||
LogInterface *log_ = nullptr;
|
LogInterface *log_ = nullptr;
|
||||||
std::atomic_flag lock_ = ATOMIC_FLAG_INIT;
|
std::atomic_flag lock_ = ATOMIC_FLAG_INIT;
|
||||||
void enter_critical() {
|
void enter_critical();
|
||||||
while (lock_.test_and_set(std::memory_order_acquire)) {
|
void exit_critical();
|
||||||
// spin
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void exit_critical() {
|
|
||||||
lock_.clear(std::memory_order_release);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
Loading…
Reference in New Issue
Block a user