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 VlogInfo* g_vlog_info_first = NULL; | |
akalin
2011/12/01 17:03:24
static and/or anon namespace for these two? (I gue
stevenjb
2011/12/01 19:09:38
Done.
| |
69 VlogInfo* g_vlog_info_second = NULL; | |
akalin
2011/12/01 17:03:24
might be clearer to just have "g_vlog_info" and "g
stevenjb
2011/12/01 19:09:38
Done.
| |
67 VlogInfo* g_vlog_info = NULL; | 70 VlogInfo* g_vlog_info = NULL; |
68 | 71 |
69 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { | 72 const char* const log_severity_names[LOG_NUM_SEVERITIES] = { |
70 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; | 73 "INFO", "WARNING", "ERROR", "ERROR_REPORT", "FATAL" }; |
71 | 74 |
72 int min_log_level = 0; | 75 int min_log_level = 0; |
73 | 76 |
74 // The default set here for logging_destination will only be used if | 77 // 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; | 78 // 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 | 79 // on POSIX platforms, where it may not even be possible to locate the |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 return true; | 353 return true; |
351 } | 354 } |
352 | 355 |
353 bool BaseInitLoggingImpl(const PathChar* new_log_file, | 356 bool BaseInitLoggingImpl(const PathChar* new_log_file, |
354 LoggingDestination logging_dest, | 357 LoggingDestination logging_dest, |
355 LogLockingState lock_log, | 358 LogLockingState lock_log, |
356 OldFileDeletionState delete_old, | 359 OldFileDeletionState delete_old, |
357 DcheckState dcheck_state) { | 360 DcheckState dcheck_state) { |
358 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 361 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
359 g_dcheck_state = dcheck_state; | 362 g_dcheck_state = dcheck_state; |
360 delete g_vlog_info; | 363 |
361 g_vlog_info = NULL; | 364 // NOTE: If g_vlog_info has already been initialized, it might be in use |
365 // by another thread. Don't delete the old VLogInfo, just abandon it and | |
366 // create a second one. We track both to avoid memory leak warnings. | |
367 CHECK(g_vlog_info_second == NULL); | |
akalin
2011/12/01 17:03:24
usual style is !g_vlog_info_second
| |
368 | |
369 VlogInfo* vlog_info = NULL; | |
oshima
2011/12/01 16:28:48
how about
DCHECK(!vlog_info_second);
vlog_info_s
stevenjb
2011/12/01 16:51:41
I'm not sure I understand your suggestion. I put t
stevenjb
2011/12/01 19:09:38
After chatting + fred's feedback, I think this wil
| |
362 // Don't bother initializing g_vlog_info unless we use one of the | 370 // Don't bother initializing g_vlog_info unless we use one of the |
363 // vlog switches. | 371 // vlog switches. |
364 if (command_line->HasSwitch(switches::kV) || | 372 if (command_line->HasSwitch(switches::kV) || |
365 command_line->HasSwitch(switches::kVModule)) { | 373 command_line->HasSwitch(switches::kVModule)) { |
366 g_vlog_info = | 374 vlog_info = |
367 new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), | 375 new VlogInfo(command_line->GetSwitchValueASCII(switches::kV), |
368 command_line->GetSwitchValueASCII(switches::kVModule), | 376 command_line->GetSwitchValueASCII(switches::kVModule), |
369 &min_log_level); | 377 &min_log_level); |
370 } | 378 } |
371 | 379 |
380 if (!g_vlog_info_first) { | |
akalin
2011/12/01 17:03:24
rewrite to use positive test, i.e. if (g_vlog_info
| |
381 g_vlog_info_first = vlog_info; | |
382 g_vlog_info = g_vlog_info_first; | |
akalin
2011/12/01 17:03:24
i couldn't understand what these two lines were do
stevenjb
2011/12/01 19:09:38
Re-factored with oshima's feedback also.
| |
383 } else { | |
384 g_vlog_info_second = vlog_info; | |
385 g_vlog_info = g_vlog_info_second; | |
386 } | |
387 | |
372 LoggingLock::Init(lock_log, new_log_file); | 388 LoggingLock::Init(lock_log, new_log_file); |
373 | 389 |
374 LoggingLock logging_lock; | 390 LoggingLock logging_lock; |
375 | 391 |
376 if (log_file) { | 392 if (log_file) { |
377 // calling InitLogging twice or after some log call has already opened the | 393 // calling InitLogging twice or after some log call has already opened the |
378 // default log file will re-initialize to the new options | 394 // default log file will re-initialize to the new options |
379 CloseFile(log_file); | 395 CloseFile(log_file); |
380 log_file = NULL; | 396 log_file = NULL; |
381 } | 397 } |
(...skipping 21 matching lines...) Expand all Loading... | |
403 int GetMinLogLevel() { | 419 int GetMinLogLevel() { |
404 return min_log_level; | 420 return min_log_level; |
405 } | 421 } |
406 | 422 |
407 int GetVlogVerbosity() { | 423 int GetVlogVerbosity() { |
408 return std::max(-1, LOG_INFO - GetMinLogLevel()); | 424 return std::max(-1, LOG_INFO - GetMinLogLevel()); |
409 } | 425 } |
410 | 426 |
411 int GetVlogLevelHelper(const char* file, size_t N) { | 427 int GetVlogLevelHelper(const char* file, size_t N) { |
412 DCHECK_GT(N, 0U); | 428 DCHECK_GT(N, 0U); |
413 return g_vlog_info ? | 429 VlogInfo* vlog_info = g_vlog_info; |
414 g_vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : | 430 return vlog_info ? |
431 vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : | |
415 GetVlogVerbosity(); | 432 GetVlogVerbosity(); |
416 } | 433 } |
417 | 434 |
418 void SetLogItems(bool enable_process_id, bool enable_thread_id, | 435 void SetLogItems(bool enable_process_id, bool enable_thread_id, |
419 bool enable_timestamp, bool enable_tickcount) { | 436 bool enable_timestamp, bool enable_tickcount) { |
420 log_process_id = enable_process_id; | 437 log_process_id = enable_process_id; |
421 log_thread_id = enable_thread_id; | 438 log_thread_id = enable_thread_id; |
422 log_timestamp = enable_timestamp; | 439 log_timestamp = enable_timestamp; |
423 log_tickcount = enable_tickcount; | 440 log_tickcount = enable_tickcount; |
424 } | 441 } |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
845 | 862 |
846 // This was defined at the beginnig of this file. | 863 // This was defined at the beginnig of this file. |
847 #undef write | 864 #undef write |
848 | 865 |
849 std::ostream& operator<<(std::ostream& o, const StringPiece& piece) { | 866 std::ostream& operator<<(std::ostream& o, const StringPiece& piece) { |
850 o.write(piece.data(), static_cast<std::streamsize>(piece.size())); | 867 o.write(piece.data(), static_cast<std::streamsize>(piece.size())); |
851 return o; | 868 return o; |
852 } | 869 } |
853 | 870 |
854 } // namespace base | 871 } // namespace base |
OLD | NEW |