Index: base/logging.cc |
diff --git a/base/logging.cc b/base/logging.cc |
index 27754af8406531c62ebf2eca7d8520c951c322e5..149bdda80c88c01e0144e5c88cc9651bf72b5807 100644 |
--- a/base/logging.cc |
+++ b/base/logging.cc |
@@ -64,7 +64,11 @@ typedef pthread_mutex_t* MutexHandle; |
namespace logging { |
DcheckState g_dcheck_state = DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS; |
+ |
+namespace { |
+ |
VlogInfo* g_vlog_info = NULL; |
+VlogInfo* g_vlog_info_prev = NULL; |
const char* const log_severity_names[LOG_NUM_SEVERITIES] = { |
"INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; |
@@ -350,6 +354,9 @@ bool InitializeLogFileHandle() { |
return true; |
} |
+} // namespace |
+ |
+ |
bool BaseInitLoggingImpl(const PathChar* new_log_file, |
LoggingDestination logging_dest, |
LogLockingState lock_log, |
@@ -357,12 +364,17 @@ bool BaseInitLoggingImpl(const PathChar* new_log_file, |
DcheckState dcheck_state) { |
CommandLine* command_line = CommandLine::ForCurrentProcess(); |
g_dcheck_state = dcheck_state; |
- delete g_vlog_info; |
- g_vlog_info = NULL; |
+ |
// Don't bother initializing g_vlog_info unless we use one of the |
// vlog switches. |
if (command_line->HasSwitch(switches::kV) || |
command_line->HasSwitch(switches::kVModule)) { |
+ // NOTE: If g_vlog_info has already been initialized, it might be in use |
+ // by another thread. Don't delete the old VLogInfo, just create a second |
+ // one. We keep track of both to avoid memory leak warnings. |
+ CHECK(!g_vlog_info_prev); |
+ g_vlog_info_prev = g_vlog_info; |
+ |
g_vlog_info = |
new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), |
command_line->GetSwitchValueASCII(switches::kVModule), |
@@ -410,8 +422,11 @@ int GetVlogVerbosity() { |
int GetVlogLevelHelper(const char* file, size_t N) { |
DCHECK_GT(N, 0U); |
- return g_vlog_info ? |
- g_vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : |
+ // Note: g_vlog_info may change on a different thread during startup |
+ // (but will always be valid or NULL). |
+ VlogInfo* vlog_info = g_vlog_info; |
+ return vlog_info ? |
+ vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : |
GetVlogVerbosity(); |
} |