Store logging streams in a manually linked list instead of std::list
LogMessage::streams_ is a global and thus should have trivial destructor Bug: None Change-Id: Ie6a8029602f50b2bc5bab546ffc0365ef0954024 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/157042 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29552}
This commit is contained in:
committed by
Commit Bot
parent
82a3f0ad7f
commit
b9f69028a0
@ -93,7 +93,8 @@ bool LogMessage::log_to_stderr_ = true;
|
||||
// Note: we explicitly do not clean this up, because of the uncertain ordering
|
||||
// of destructors at program exit. Let the person who sets the stream trigger
|
||||
// cleanup by setting to null, or let it leak (safe at program exit).
|
||||
LogMessage::StreamList LogMessage::streams_ RTC_GUARDED_BY(g_log_crit);
|
||||
ABSL_CONST_INIT LogSink* LogMessage::streams_ RTC_GUARDED_BY(g_log_crit) =
|
||||
nullptr;
|
||||
|
||||
// Boolean options default to false (0)
|
||||
bool LogMessage::thread_, LogMessage::timestamp_;
|
||||
@ -201,12 +202,12 @@ LogMessage::~LogMessage() {
|
||||
}
|
||||
|
||||
GlobalLockScope cs(&g_log_crit);
|
||||
for (auto& kv : streams_) {
|
||||
if (severity_ >= kv.second) {
|
||||
for (LogSink* entry = streams_; entry != nullptr; entry = entry->next_) {
|
||||
if (severity_ >= entry->min_severity_) {
|
||||
#if defined(WEBRTC_ANDROID)
|
||||
kv.first->OnLogMessage(str, severity_, tag_);
|
||||
entry->OnLogMessage(str, severity_, tag_);
|
||||
#else
|
||||
kv.first->OnLogMessage(str, severity_);
|
||||
entry->OnLogMessage(str, severity_);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -260,9 +261,9 @@ void LogMessage::SetLogToStderr(bool log_to_stderr) {
|
||||
int LogMessage::GetLogToStream(LogSink* stream) {
|
||||
GlobalLockScope cs(&g_log_crit);
|
||||
LoggingSeverity sev = LS_NONE;
|
||||
for (auto& kv : streams_) {
|
||||
if (!stream || stream == kv.first) {
|
||||
sev = std::min(sev, kv.second);
|
||||
for (LogSink* entry = streams_; entry != nullptr; entry = entry->next_) {
|
||||
if (stream == nullptr || stream == entry) {
|
||||
sev = std::min(sev, entry->min_severity_);
|
||||
}
|
||||
}
|
||||
return sev;
|
||||
@ -270,15 +271,18 @@ int LogMessage::GetLogToStream(LogSink* stream) {
|
||||
|
||||
void LogMessage::AddLogToStream(LogSink* stream, LoggingSeverity min_sev) {
|
||||
GlobalLockScope cs(&g_log_crit);
|
||||
streams_.push_back(std::make_pair(stream, min_sev));
|
||||
stream->min_severity_ = min_sev;
|
||||
stream->next_ = streams_;
|
||||
streams_ = stream;
|
||||
UpdateMinLogSeverity();
|
||||
}
|
||||
|
||||
void LogMessage::RemoveLogToStream(LogSink* stream) {
|
||||
GlobalLockScope cs(&g_log_crit);
|
||||
for (StreamList::iterator it = streams_.begin(); it != streams_.end(); ++it) {
|
||||
if (stream == it->first) {
|
||||
streams_.erase(it);
|
||||
for (LogSink** entry = &streams_; *entry != nullptr;
|
||||
entry = &(*entry)->next_) {
|
||||
if (*entry == stream) {
|
||||
*entry = (*entry)->next_;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -337,9 +341,8 @@ void LogMessage::ConfigureLogging(const char* params) {
|
||||
void LogMessage::UpdateMinLogSeverity()
|
||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(g_log_crit) {
|
||||
LoggingSeverity min_sev = g_dbg_sev;
|
||||
for (const auto& kv : streams_) {
|
||||
const LoggingSeverity sev = kv.second;
|
||||
min_sev = std::min(min_sev, sev);
|
||||
for (LogSink* entry = streams_; entry != nullptr; entry = entry->next_) {
|
||||
min_sev = std::min(min_sev, entry->min_severity_);
|
||||
}
|
||||
g_min_sev = min_sev;
|
||||
}
|
||||
@ -445,10 +448,7 @@ bool LogMessage::IsNoop(LoggingSeverity severity) {
|
||||
// is going to be logged. This introduces unnecessary synchronization for
|
||||
// a feature that's mostly used for testing.
|
||||
GlobalLockScope cs(&g_log_crit);
|
||||
if (streams_.size() > 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return streams_ == nullptr;
|
||||
}
|
||||
|
||||
void LogMessage::FinishPrintStream() {
|
||||
|
||||
Reference in New Issue
Block a user