OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/logging.h" | 5 #include "base/logging.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <io.h> | 8 #include <io.h> |
9 #include <windows.h> | 9 #include <windows.h> |
10 typedef HANDLE FileHandle; | 10 typedef HANDLE FileHandle; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 #include "base/safe_strerror_posix.h" | 57 #include "base/safe_strerror_posix.h" |
58 #endif | 58 #endif |
59 | 59 |
60 #if defined(OS_ANDROID) | 60 #if defined(OS_ANDROID) |
61 #include <android/log.h> | 61 #include <android/log.h> |
62 #endif | 62 #endif |
63 | 63 |
64 namespace logging { | 64 namespace logging { |
65 | 65 |
66 DcheckState g_dcheck_state = DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS; | 66 DcheckState g_dcheck_state = DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS; |
| 67 |
| 68 namespace { |
| 69 |
67 VlogInfo* g_vlog_info = NULL; | 70 VlogInfo* g_vlog_info = NULL; |
| 71 VlogInfo* g_vlog_info_prev = NULL; |
68 | 72 |
69 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { | 73 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { |
70 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; | 74 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; |
71 | 75 |
72 int min_log_level = 0; | 76 int min_log_level = 0; |
73 | 77 |
74 // The default set here for logging_destination will only be used if | 78 // The default set here for logging_destination will only be used if |
75 // InitLogging is not called. On Windows, use a file next to the exe; | 79 // InitLogging is not called. On Windows, use a file next to the exe; |
76 // on POSIX platforms, where it may not even be possible to locate the | 80 // on POSIX platforms, where it may not even be possible to locate the |
77 // executable on disk, use stderr. | 81 // executable on disk, use stderr. |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 #elif defined(OS_POSIX) | 347 #elif defined(OS_POSIX) |
344 log_file = fopen(log_file_name->c_str(), "a"); | 348 log_file = fopen(log_file_name->c_str(), "a"); |
345 if (log_file == NULL) | 349 if (log_file == NULL) |
346 return false; | 350 return false; |
347 #endif | 351 #endif |
348 } | 352 } |
349 | 353 |
350 return true; | 354 return true; |
351 } | 355 } |
352 | 356 |
| 357 } // namespace |
| 358 |
| 359 |
353 bool BaseInitLoggingImpl(const PathChar* new_log_file, | 360 bool BaseInitLoggingImpl(const PathChar* new_log_file, |
354 LoggingDestination logging_dest, | 361 LoggingDestination logging_dest, |
355 LogLockingState lock_log, | 362 LogLockingState lock_log, |
356 OldFileDeletionState delete_old, | 363 OldFileDeletionState delete_old, |
357 DcheckState dcheck_state) { | 364 DcheckState dcheck_state) { |
358 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 365 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
359 g_dcheck_state = dcheck_state; | 366 g_dcheck_state = dcheck_state; |
360 delete g_vlog_info; | 367 |
361 g_vlog_info = NULL; | |
362 // Don't bother initializing g_vlog_info unless we use one of the | 368 // Don't bother initializing g_vlog_info unless we use one of the |
363 // vlog switches. | 369 // vlog switches. |
364 if (command_line->HasSwitch(switches::kV) || | 370 if (command_line->HasSwitch(switches::kV) || |
365 command_line->HasSwitch(switches::kVModule)) { | 371 command_line->HasSwitch(switches::kVModule)) { |
| 372 // NOTE: If g_vlog_info has already been initialized, it might be in use |
| 373 // by another thread. Don't delete the old VLogInfo, just create a second |
| 374 // one. We keep track of both to avoid memory leak warnings. |
| 375 CHECK(!g_vlog_info_prev); |
| 376 g_vlog_info_prev = g_vlog_info; |
| 377 |
366 g_vlog_info = | 378 g_vlog_info = |
367 new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), | 379 new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), |
368 command_line->GetSwitchValueASCII(switches::kVModule), | 380 command_line->GetSwitchValueASCII(switches::kVModule), |
369 &min_log_level); | 381 &min_log_level); |
370 } | 382 } |
371 | 383 |
372 LoggingLock::Init(lock_log, new_log_file); | 384 LoggingLock::Init(lock_log, new_log_file); |
373 | 385 |
374 LoggingLock logging_lock; | 386 LoggingLock logging_lock; |
375 | 387 |
(...skipping 27 matching lines...) Expand all Loading... |
403 int GetMinLogLevel() { | 415 int GetMinLogLevel() { |
404 return min_log_level; | 416 return min_log_level; |
405 } | 417 } |
406 | 418 |
407 int GetVlogVerbosity() { | 419 int GetVlogVerbosity() { |
408 return std::max(-1, LOG_INFO - GetMinLogLevel()); | 420 return std::max(-1, LOG_INFO - GetMinLogLevel()); |
409 } | 421 } |
410 | 422 |
411 int GetVlogLevelHelper(const char* file, size_t N) { | 423 int GetVlogLevelHelper(const char* file, size_t N) { |
412 DCHECK_GT(N, 0U); | 424 DCHECK_GT(N, 0U); |
413 return g_vlog_info ? | 425 // Note: g_vlog_info may change on a different thread during startup |
414 g_vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : | 426 // (but will always be valid or NULL). |
| 427 VlogInfo* vlog_info = g_vlog_info; |
| 428 return vlog_info ? |
| 429 vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : |
415 GetVlogVerbosity(); | 430 GetVlogVerbosity(); |
416 } | 431 } |
417 | 432 |
418 void SetLogItems(bool enable_process_id, bool enable_thread_id, | 433 void SetLogItems(bool enable_process_id, bool enable_thread_id, |
419 bool enable_timestamp, bool enable_tickcount) { | 434 bool enable_timestamp, bool enable_tickcount) { |
420 log_process_id = enable_process_id; | 435 log_process_id = enable_process_id; |
421 log_thread_id = enable_thread_id; | 436 log_thread_id = enable_thread_id; |
422 log_timestamp = enable_timestamp; | 437 log_timestamp = enable_timestamp; |
423 log_tickcount = enable_tickcount; | 438 log_tickcount = enable_tickcount; |
424 } | 439 } |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 | 860 |
846 // This was defined at the beginnig of this file. | 861 // This was defined at the beginnig of this file. |
847 #undef write | 862 #undef write |
848 | 863 |
849 std::ostream& operator<<(std::ostream& o, const StringPiece& piece) { | 864 std::ostream& operator<<(std::ostream& o, const StringPiece& piece) { |
850 o.write(piece.data(), static_cast<std::streamsize>(piece.size())); | 865 o.write(piece.data(), static_cast<std::streamsize>(piece.size())); |
851 return o; | 866 return o; |
852 } | 867 } |
853 | 868 |
854 } // namespace base | 869 } // namespace base |
OLD | NEW |