Index: base/logging.cc |
diff --git a/base/logging.cc b/base/logging.cc |
index 49623bf555abfa0d7f09874f9b821bfa1e3fbd1b..534a897c11256e34e357a8f125de367f18916fd9 100644 |
--- a/base/logging.cc |
+++ b/base/logging.cc |
@@ -80,20 +80,12 @@ namespace { |
VlogInfo* g_vlog_info = NULL; |
VlogInfo* g_vlog_info_prev = NULL; |
-const char* const log_severity_names[LOG_NUM_SEVERITIES] = { |
+const char* const kLogSeverityNames[LOG_NUM_SEVERITIES] = { |
"INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; |
-int min_log_level = 0; |
+int g_min_log_level = 0; |
brettw
2013/06/19 18:10:13
This stuff is in an anonymous namespace in a .cc f
akalin
2013/06/19 19:59:18
Done. There were already some existing g_ variable
|
-// The default set here for logging_destination will only be used if |
-// InitLogging is not called. On Windows, use a file next to the exe; |
-// on POSIX platforms, where it may not even be possible to locate the |
-// executable on disk, use stderr. |
-#if defined(OS_WIN) |
-LoggingDestination logging_destination = LOG_ONLY_TO_FILE; |
-#elif defined(OS_POSIX) |
-LoggingDestination logging_destination = LOG_ONLY_TO_SYSTEM_DEBUG_LOG; |
-#endif |
+LoggingDestination g_logging_destination = LOG_DEFAULT; |
// For LOG_ERROR and above, always print to stderr. |
const int kAlwaysPrintErrorLevel = LOG_ERROR; |
@@ -106,28 +98,28 @@ typedef std::wstring PathString; |
#else |
typedef std::string PathString; |
#endif |
-PathString* log_file_name = NULL; |
+PathString* g_log_file_name = NULL; |
// this file is lazily opened and the handle may be NULL |
-FileHandle log_file = NULL; |
+FileHandle g_log_file = NULL; |
// what should be prepended to each message? |
-bool log_process_id = false; |
-bool log_thread_id = false; |
-bool log_timestamp = true; |
-bool log_tickcount = false; |
+bool g_log_process_id = false; |
+bool g_log_thread_id = false; |
+bool g_log_timestamp = true; |
+bool g_log_tickcount = false; |
// Should we pop up fatal debug messages in a dialog? |
-bool show_error_dialogs = false; |
+bool g_show_error_dialogs = false; |
// An assert handler override specified by the client to be called instead of |
// the debug message dialog and process termination. |
-LogAssertHandlerFunction log_assert_handler = NULL; |
+LogAssertHandlerFunction g_log_assert_handler = NULL; |
// An report handler override specified by the client to be called instead of |
// the debug message dialog. |
-LogReportHandlerFunction log_report_handler = NULL; |
+LogReportHandlerFunction g_log_report_handler = NULL; |
// A log message handler that gets notified of every log message we process. |
-LogMessageHandlerFunction log_message_handler = NULL; |
+LogMessageHandlerFunction g_log_message_handler = NULL; |
// Helper functions to wrap platform differences. |
@@ -184,13 +176,13 @@ PathString GetDefaultLogFile() { |
wchar_t module_name[MAX_PATH]; |
GetModuleFileName(NULL, module_name, MAX_PATH); |
- PathString log_file = module_name; |
+ PathString g_log_file = module_name; |
PathString::size_type last_backslash = |
- log_file.rfind('\\', log_file.size()); |
+ g_log_file.rfind('\\', g_log_file.size()); |
if (last_backslash != PathString::npos) |
- log_file.erase(last_backslash + 1); |
- log_file += L"debug.log"; |
- return log_file; |
+ g_log_file.erase(last_backslash + 1); |
+ g_log_file += L"debug.log"; |
+ return g_log_file; |
#elif defined(OS_POSIX) |
// On other platforms we just use the current directory. |
return PathString("debug.log"); |
@@ -314,35 +306,34 @@ pthread_mutex_t LoggingLock::log_mutex = PTHREAD_MUTEX_INITIALIZER; |
// and can be used for writing. Returns false if the file could not be |
// initialized. debug_file will be NULL in this case. |
bool InitializeLogFileHandle() { |
- if (log_file) |
+ if (g_log_file) |
return true; |
- if (!log_file_name) { |
+ if (!g_log_file_name) { |
// Nobody has called InitLogging to specify a debug log file, so here we |
// initialize the log file name to a default. |
- log_file_name = new PathString(GetDefaultLogFile()); |
+ g_log_file_name = new PathString(GetDefaultLogFile()); |
} |
- if (logging_destination == LOG_ONLY_TO_FILE || |
- logging_destination == LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG) { |
+ if ((g_logging_destination & LOG_TO_FILE) != 0) { |
#if defined(OS_WIN) |
- log_file = CreateFile(log_file_name->c_str(), GENERIC_WRITE, |
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, |
- OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
- if (log_file == INVALID_HANDLE_VALUE || log_file == NULL) { |
- // try the current directory |
- log_file = CreateFile(L".\\debug.log", GENERIC_WRITE, |
+ g_log_file = CreateFile(g_log_file_name->c_str(), GENERIC_WRITE, |
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, |
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
- if (log_file == INVALID_HANDLE_VALUE || log_file == NULL) { |
- log_file = NULL; |
+ if (g_log_file == INVALID_HANDLE_VALUE || g_log_file == NULL) { |
+ // try the current directory |
+ g_log_file = CreateFile(L".\\debug.log", GENERIC_WRITE, |
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, |
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
+ if (g_log_file == INVALID_HANDLE_VALUE || g_log_file == NULL) { |
+ g_log_file = NULL; |
return false; |
} |
} |
- SetFilePointer(log_file, 0, 0, FILE_END); |
+ SetFilePointer(g_log_file, 0, 0, FILE_END); |
#elif defined(OS_POSIX) |
- log_file = fopen(log_file_name->c_str(), "a"); |
- if (log_file == NULL) |
+ g_log_file = fopen(g_log_file_name->c_str(), "a"); |
+ if (g_log_file == NULL) |
return false; |
#endif |
} |
@@ -352,17 +343,19 @@ bool InitializeLogFileHandle() { |
} // namespace |
+LoggingSettings::LoggingSettings() |
+ : logging_dest(LOG_DEFAULT), |
+ log_file(NULL), |
+ lock_log(LOCK_LOG_FILE), |
+ delete_old(APPEND_TO_OLD_LOG_FILE), |
+ dcheck_state(DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS) {} |
-bool BaseInitLoggingImpl(const PathChar* new_log_file, |
- LoggingDestination logging_dest, |
- LogLockingState lock_log, |
- OldFileDeletionState delete_old, |
- DcheckState dcheck_state) { |
+bool BaseInitLoggingImpl(const LoggingSettings& settings) { |
#if defined(OS_NACL) |
- CHECK(logging_dest == LOG_NONE || |
- logging_dest == LOG_ONLY_TO_SYSTEM_DEBUG_LOG); |
+ // Can log only to the system debug log. |
+ CHECK_EQ(settings.logging_dest & ~LOG_TO_SYSTEM_DEBUG_LOG, 0); |
#endif |
- g_dcheck_state = dcheck_state; |
+ g_dcheck_state = settings.dcheck_state; |
CommandLine* command_line = CommandLine::ForCurrentProcess(); |
// Don't bother initializing g_vlog_info unless we use one of the |
// vlog switches. |
@@ -377,42 +370,41 @@ bool BaseInitLoggingImpl(const PathChar* new_log_file, |
g_vlog_info = |
new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), |
command_line->GetSwitchValueASCII(switches::kVModule), |
- &min_log_level); |
+ &g_min_log_level); |
} |
- LoggingLock::Init(lock_log, new_log_file); |
+ LoggingLock::Init(settings.lock_log, settings.log_file); |
LoggingLock logging_lock; |
- if (log_file) { |
+ if (g_log_file) { |
// calling InitLogging twice or after some log call has already opened the |
// default log file will re-initialize to the new options |
- CloseFile(log_file); |
- log_file = NULL; |
+ CloseFile(g_log_file); |
+ g_log_file = NULL; |
} |
- logging_destination = logging_dest; |
+ g_logging_destination = settings.logging_dest; |
- // ignore file options if logging is disabled or only to system |
- if (logging_destination == LOG_NONE || |
- logging_destination == LOG_ONLY_TO_SYSTEM_DEBUG_LOG) |
+ // ignore file options unless logging to file is set. |
+ if ((g_logging_destination & LOG_TO_FILE) == 0) |
return true; |
- if (!log_file_name) |
- log_file_name = new PathString(); |
- *log_file_name = new_log_file; |
- if (delete_old == DELETE_OLD_LOG_FILE) |
- DeleteFilePath(*log_file_name); |
+ if (!g_log_file_name) |
+ g_log_file_name = new PathString(); |
+ *g_log_file_name = settings.log_file; |
+ if (settings.delete_old == DELETE_OLD_LOG_FILE) |
+ DeleteFilePath(*g_log_file_name); |
return InitializeLogFileHandle(); |
} |
void SetMinLogLevel(int level) { |
- min_log_level = std::min(LOG_ERROR_REPORT, level); |
+ g_min_log_level = std::min(LOG_ERROR_REPORT, level); |
} |
int GetMinLogLevel() { |
- return min_log_level; |
+ return g_min_log_level; |
} |
int GetVlogVerbosity() { |
@@ -431,30 +423,30 @@ int GetVlogLevelHelper(const char* file, size_t N) { |
void SetLogItems(bool enable_process_id, bool enable_thread_id, |
bool enable_timestamp, bool enable_tickcount) { |
- log_process_id = enable_process_id; |
- log_thread_id = enable_thread_id; |
- log_timestamp = enable_timestamp; |
- log_tickcount = enable_tickcount; |
+ g_log_process_id = enable_process_id; |
+ g_log_thread_id = enable_thread_id; |
+ g_log_timestamp = enable_timestamp; |
+ g_log_tickcount = enable_tickcount; |
} |
void SetShowErrorDialogs(bool enable_dialogs) { |
- show_error_dialogs = enable_dialogs; |
+ g_show_error_dialogs = enable_dialogs; |
} |
void SetLogAssertHandler(LogAssertHandlerFunction handler) { |
- log_assert_handler = handler; |
+ g_log_assert_handler = handler; |
} |
void SetLogReportHandler(LogReportHandlerFunction handler) { |
- log_report_handler = handler; |
+ g_log_report_handler = handler; |
} |
void SetLogMessageHandler(LogMessageHandlerFunction handler) { |
- log_message_handler = handler; |
+ g_log_message_handler = handler; |
} |
LogMessageHandlerFunction GetLogMessageHandler() { |
- return log_message_handler; |
+ return g_log_message_handler; |
} |
// MSVC doesn't like complex extern templates and DLLs. |
@@ -481,7 +473,7 @@ void DisplayDebugMessageInDialog(const std::string& str) { |
if (str.empty()) |
return; |
- if (!show_error_dialogs) |
+ if (!g_show_error_dialogs) |
return; |
#if defined(OS_WIN) |
@@ -578,14 +570,14 @@ LogMessage::~LogMessage() { |
std::string str_newline(stream_.str()); |
// Give any log message handler first dibs on the message. |
- if (log_message_handler && log_message_handler(severity_, file_, line_, |
- message_start_, str_newline)) { |
+ if (g_log_message_handler && |
+ g_log_message_handler(severity_, file_, line_, |
+ message_start_, str_newline)) { |
// The handler took care of it, no further processing. |
return; |
} |
- if (logging_destination == LOG_ONLY_TO_SYSTEM_DEBUG_LOG || |
- logging_destination == LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG) { |
+ if ((g_logging_destination & LOG_TO_SYSTEM_DEBUG_LOG) != 0) { |
#if defined(OS_WIN) |
OutputDebugStringA(str_newline.c_str()); |
#elif defined(OS_ANDROID) |
@@ -627,21 +619,20 @@ LogMessage::~LogMessage() { |
// thread at the beginning of execution. |
LoggingLock::Init(LOCK_LOG_FILE, NULL); |
// write to log file |
- if (logging_destination != LOG_NONE && |
- logging_destination != LOG_ONLY_TO_SYSTEM_DEBUG_LOG) { |
+ if ((g_logging_destination & LOG_TO_FILE) != 0) { |
LoggingLock logging_lock; |
if (InitializeLogFileHandle()) { |
#if defined(OS_WIN) |
- SetFilePointer(log_file, 0, 0, SEEK_END); |
+ SetFilePointer(g_log_file, 0, 0, SEEK_END); |
DWORD num_written; |
- WriteFile(log_file, |
+ WriteFile(g_log_file, |
static_cast<const void*>(str_newline.c_str()), |
static_cast<DWORD>(str_newline.length()), |
&num_written, |
NULL); |
#else |
- fprintf(log_file, "%s", str_newline.c_str()); |
- fflush(log_file); |
+ fprintf(g_log_file, "%s", str_newline.c_str()); |
+ fflush(g_log_file); |
#endif |
} |
} |
@@ -657,9 +648,9 @@ LogMessage::~LogMessage() { |
if (base::debug::BeingDebugged()) { |
base::debug::BreakDebugger(); |
} else { |
- if (log_assert_handler) { |
+ if (g_log_assert_handler) { |
// make a copy of the string for the handler out of paranoia |
- log_assert_handler(std::string(stream_.str())); |
+ g_log_assert_handler(std::string(stream_.str())); |
} else { |
// Don't use the string with the newline, get a fresh version to send to |
// the debug message process. We also don't display assertions to the |
@@ -675,8 +666,8 @@ LogMessage::~LogMessage() { |
} |
} else if (severity_ == LOG_ERROR_REPORT) { |
// We are here only if the user runs with --enable-dcheck in release mode. |
- if (log_report_handler) { |
- log_report_handler(std::string(stream_.str())); |
+ if (g_log_report_handler) { |
+ g_log_report_handler(std::string(stream_.str())); |
} else { |
DisplayDebugMessageInDialog(stream_.str()); |
} |
@@ -693,11 +684,11 @@ void LogMessage::Init(const char* file, int line) { |
// TODO(darin): It might be nice if the columns were fixed width. |
stream_ << '['; |
- if (log_process_id) |
+ if (g_log_process_id) |
stream_ << CurrentProcessId() << ':'; |
- if (log_thread_id) |
+ if (g_log_thread_id) |
stream_ << base::PlatformThread::CurrentId() << ':'; |
- if (log_timestamp) { |
+ if (g_log_timestamp) { |
time_t t = time(NULL); |
struct tm local_time = {0}; |
#if _MSC_VER >= 1400 |
@@ -715,10 +706,10 @@ void LogMessage::Init(const char* file, int line) { |
<< std::setw(2) << tm_time->tm_sec |
<< ':'; |
} |
- if (log_tickcount) |
+ if (g_log_tickcount) |
stream_ << TickCount() << ':'; |
if (severity_ >= 0) |
- stream_ << log_severity_names[severity_]; |
+ stream_ << kLogSeverityNames[severity_]; |
else |
stream_ << "VERBOSE" << -severity_; |
@@ -822,15 +813,15 @@ ErrnoLogMessage::~ErrnoLogMessage() { |
void CloseLogFile() { |
LoggingLock logging_lock; |
- if (!log_file) |
+ if (!g_log_file) |
return; |
- CloseFile(log_file); |
- log_file = NULL; |
+ CloseFile(g_log_file); |
+ g_log_file = NULL; |
} |
void RawLog(int level, const char* message) { |
- if (level >= min_log_level) { |
+ if (level >= g_min_log_level) { |
size_t bytes_written = 0; |
const size_t message_len = strlen(message); |
int rv; |
@@ -865,8 +856,8 @@ void RawLog(int level, const char* message) { |
#if defined(OS_WIN) |
std::wstring GetLogFileFullPath() { |
- if (log_file_name) |
- return *log_file_name; |
+ if (g_log_file_name) |
+ return *g_log_file_name; |
return std::wstring(); |
} |
#endif |