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:
Danil Chapovalov
2019-10-21 09:19:10 +02:00
committed by Commit Bot
parent 82a3f0ad7f
commit b9f69028a0
5 changed files with 37 additions and 31 deletions

View File

@ -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() {