Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: base/logging.h

Issue 1446363003: Deleted OS_WIN and all Windows specific files from base. (Closed) Base URL: https://github.com/domokit/mojo.git@base_tests
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/json/json_writer_unittest.cc ('k') | base/logging.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #ifndef BASE_LOGGING_H_ 5 #ifndef BASE_LOGGING_H_
6 #define BASE_LOGGING_H_ 6 #define BASE_LOGGING_H_
7 7
8 #include <cassert> 8 #include <cassert>
9 #include <string> 9 #include <string>
10 #include <cstring> 10 #include <cstring>
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 // 131 //
132 // Very important: logging a message at the FATAL severity level causes 132 // Very important: logging a message at the FATAL severity level causes
133 // the program to terminate (after the message is logged). 133 // the program to terminate (after the message is logged).
134 // 134 //
135 // There is the special severity of DFATAL, which logs FATAL in debug mode, 135 // There is the special severity of DFATAL, which logs FATAL in debug mode,
136 // ERROR in normal mode. 136 // ERROR in normal mode.
137 137
138 namespace logging { 138 namespace logging {
139 139
140 // TODO(avi): do we want to do a unification of character types here? 140 // TODO(avi): do we want to do a unification of character types here?
141 #if defined(OS_WIN)
142 typedef wchar_t PathChar;
143 #else
144 typedef char PathChar; 141 typedef char PathChar;
145 #endif
146 142
147 // Where to record logging output? A flat file and/or system debug log 143 // Where to record logging output? A flat file and/or system debug log
148 // via OutputDebugString. 144 // via OutputDebugString.
149 enum LoggingDestination { 145 enum LoggingDestination {
150 LOG_NONE = 0, 146 LOG_NONE = 0,
151 LOG_TO_FILE = 1 << 0, 147 LOG_TO_FILE = 1 << 0,
152 LOG_TO_SYSTEM_DEBUG_LOG = 1 << 1, 148 LOG_TO_SYSTEM_DEBUG_LOG = 1 << 1,
153 149
154 LOG_TO_ALL = LOG_TO_FILE | LOG_TO_SYSTEM_DEBUG_LOG, 150 LOG_TO_ALL = LOG_TO_FILE | LOG_TO_SYSTEM_DEBUG_LOG,
155 151
156 // On Windows, use a file next to the exe; on POSIX platforms, where 152 // On POSIX platforms, where it may not even be possible to locate the
157 // it may not even be possible to locate the executable on disk, use 153 // executable on disk, use stderr.
158 // stderr. 154 #if defined(OS_POSIX)
159 #if defined(OS_WIN)
160 LOG_DEFAULT = LOG_TO_FILE,
161 #elif defined(OS_POSIX)
162 LOG_DEFAULT = LOG_TO_SYSTEM_DEBUG_LOG, 155 LOG_DEFAULT = LOG_TO_SYSTEM_DEBUG_LOG,
163 #endif 156 #endif
164 }; 157 };
165 158
166 // Indicates that the log file should be locked when being written to. 159 // Indicates that the log file should be locked when being written to.
167 // Unless there is only one single-threaded process that is logging to 160 // Unless there is only one single-threaded process that is logging to
168 // the log file, the file should be locked during writes to make each 161 // the log file, the file should be locked during writes to make each
169 // log output atomic. Other writers will block. 162 // log output atomic. Other writers will block.
170 // 163 //
171 // All processes writing to the log file must have their locking set for it to 164 // All processes writing to the log file must have their locking set for it to
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 COMPACT_GOOGLE_LOG_EX_INFO(LogMessage) 308 COMPACT_GOOGLE_LOG_EX_INFO(LogMessage)
316 #define COMPACT_GOOGLE_LOG_WARNING \ 309 #define COMPACT_GOOGLE_LOG_WARNING \
317 COMPACT_GOOGLE_LOG_EX_WARNING(LogMessage) 310 COMPACT_GOOGLE_LOG_EX_WARNING(LogMessage)
318 #define COMPACT_GOOGLE_LOG_ERROR \ 311 #define COMPACT_GOOGLE_LOG_ERROR \
319 COMPACT_GOOGLE_LOG_EX_ERROR(LogMessage) 312 COMPACT_GOOGLE_LOG_EX_ERROR(LogMessage)
320 #define COMPACT_GOOGLE_LOG_FATAL \ 313 #define COMPACT_GOOGLE_LOG_FATAL \
321 COMPACT_GOOGLE_LOG_EX_FATAL(LogMessage) 314 COMPACT_GOOGLE_LOG_EX_FATAL(LogMessage)
322 #define COMPACT_GOOGLE_LOG_DFATAL \ 315 #define COMPACT_GOOGLE_LOG_DFATAL \
323 COMPACT_GOOGLE_LOG_EX_DFATAL(LogMessage) 316 COMPACT_GOOGLE_LOG_EX_DFATAL(LogMessage)
324 317
325 #if defined(OS_WIN)
326 // wingdi.h defines ERROR to be 0. When we call LOG(ERROR), it gets
327 // substituted with 0, and it expands to COMPACT_GOOGLE_LOG_0. To allow us
328 // to keep using this syntax, we define this macro to do the same thing
329 // as COMPACT_GOOGLE_LOG_ERROR, and also define ERROR the same way that
330 // the Windows SDK does for consistency.
331 #define ERROR 0
332 #define COMPACT_GOOGLE_LOG_EX_0(ClassName, ...) \
333 COMPACT_GOOGLE_LOG_EX_ERROR(ClassName , ##__VA_ARGS__)
334 #define COMPACT_GOOGLE_LOG_0 COMPACT_GOOGLE_LOG_ERROR
335 // Needed for LOG_IS_ON(ERROR).
336 const LogSeverity LOG_0 = LOG_ERROR;
337 #endif
338
339 // As special cases, we can assume that LOG_IS_ON(FATAL) always holds. Also, 318 // As special cases, we can assume that LOG_IS_ON(FATAL) always holds. Also,
340 // LOG_IS_ON(DFATAL) always holds in debug mode. In particular, CHECK()s will 319 // LOG_IS_ON(DFATAL) always holds in debug mode. In particular, CHECK()s will
341 // always fire if they fail. 320 // always fire if they fail.
342 #define LOG_IS_ON(severity) \ 321 #define LOG_IS_ON(severity) \
343 ((::logging::LOG_ ## severity) >= ::logging::GetMinLogLevel()) 322 ((::logging::LOG_ ## severity) >= ::logging::GetMinLogLevel())
344 323
345 // We can't do any caching tricks with VLOG_IS_ON() like the 324 // We can't do any caching tricks with VLOG_IS_ON() like the
346 // google-glog version since it requires GCC extensions. This means 325 // google-glog version since it requires GCC extensions. This means
347 // that using the v-logging functions in conjunction with --vmodule 326 // that using the v-logging functions in conjunction with --vmodule
348 // may be slow. 327 // may be slow.
(...skipping 26 matching lines...) Expand all
375 #define VLOG_STREAM(verbose_level) \ 354 #define VLOG_STREAM(verbose_level) \
376 logging::LogMessage(__FILE__, __LINE__, -verbose_level).stream() 355 logging::LogMessage(__FILE__, __LINE__, -verbose_level).stream()
377 356
378 #define VLOG(verbose_level) \ 357 #define VLOG(verbose_level) \
379 LAZY_STREAM(VLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level)) 358 LAZY_STREAM(VLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level))
380 359
381 #define VLOG_IF(verbose_level, condition) \ 360 #define VLOG_IF(verbose_level, condition) \
382 LAZY_STREAM(VLOG_STREAM(verbose_level), \ 361 LAZY_STREAM(VLOG_STREAM(verbose_level), \
383 VLOG_IS_ON(verbose_level) && (condition)) 362 VLOG_IS_ON(verbose_level) && (condition))
384 363
385 #if defined (OS_WIN) 364 #if defined(OS_POSIX)
386 #define VPLOG_STREAM(verbose_level) \
387 logging::Win32ErrorLogMessage(__FILE__, __LINE__, -verbose_level, \
388 ::logging::GetLastSystemErrorCode()).stream()
389 #elif defined(OS_POSIX)
390 #define VPLOG_STREAM(verbose_level) \ 365 #define VPLOG_STREAM(verbose_level) \
391 logging::ErrnoLogMessage(__FILE__, __LINE__, -verbose_level, \ 366 logging::ErrnoLogMessage(__FILE__, __LINE__, -verbose_level, \
392 ::logging::GetLastSystemErrorCode()).stream() 367 ::logging::GetLastSystemErrorCode()).stream()
393 #endif 368 #endif
394 369
395 #define VPLOG(verbose_level) \ 370 #define VPLOG(verbose_level) \
396 LAZY_STREAM(VPLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level)) 371 LAZY_STREAM(VPLOG_STREAM(verbose_level), VLOG_IS_ON(verbose_level))
397 372
398 #define VPLOG_IF(verbose_level, condition) \ 373 #define VPLOG_IF(verbose_level, condition) \
399 LAZY_STREAM(VPLOG_STREAM(verbose_level), \ 374 LAZY_STREAM(VPLOG_STREAM(verbose_level), \
400 VLOG_IS_ON(verbose_level) && (condition)) 375 VLOG_IS_ON(verbose_level) && (condition))
401 376
402 // TODO(akalin): Add more VLOG variants, e.g. VPLOG. 377 // TODO(akalin): Add more VLOG variants, e.g. VPLOG.
403 378
404 #define LOG_ASSERT(condition) \ 379 #define LOG_ASSERT(condition) \
405 LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". " 380 LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". "
406 #define SYSLOG_ASSERT(condition) \ 381 #define SYSLOG_ASSERT(condition) \
407 SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". " 382 SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". "
408 383
409 #if defined(OS_WIN) 384 #if defined(OS_POSIX)
410 #define PLOG_STREAM(severity) \
411 COMPACT_GOOGLE_LOG_EX_ ## severity(Win32ErrorLogMessage, \
412 ::logging::GetLastSystemErrorCode()).stream()
413 #elif defined(OS_POSIX)
414 #define PLOG_STREAM(severity) \ 385 #define PLOG_STREAM(severity) \
415 COMPACT_GOOGLE_LOG_EX_ ## severity(ErrnoLogMessage, \ 386 COMPACT_GOOGLE_LOG_EX_ ## severity(ErrnoLogMessage, \
416 ::logging::GetLastSystemErrorCode()).stream() 387 ::logging::GetLastSystemErrorCode()).stream()
417 #endif 388 #endif
418 389
419 #define PLOG(severity) \ 390 #define PLOG(severity) \
420 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity)) 391 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity))
421 392
422 #define PLOG_IF(severity, condition) \ 393 #define PLOG_IF(severity, condition) \
423 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition)) 394 LAZY_STREAM(PLOG_STREAM(severity), LOG_IS_ON(severity) && (condition))
(...skipping 19 matching lines...) Expand all
443 // into a macro (like __debugbreak() on Windows). 414 // into a macro (like __debugbreak() on Windows).
444 #define CHECK(condition) \ 415 #define CHECK(condition) \
445 !(condition) ? ::base::debug::BreakDebugger() : EAT_STREAM_PARAMETERS 416 !(condition) ? ::base::debug::BreakDebugger() : EAT_STREAM_PARAMETERS
446 417
447 #define PCHECK(condition) CHECK(condition) 418 #define PCHECK(condition) CHECK(condition)
448 419
449 #define CHECK_OP(name, op, val1, val2) CHECK((val1) op (val2)) 420 #define CHECK_OP(name, op, val1, val2) CHECK((val1) op (val2))
450 421
451 #else 422 #else
452 423
453 #if defined(_PREFAST_) && defined(OS_WIN)
454 // Use __analysis_assume to tell the VC++ static analysis engine that
455 // assert conditions are true, to suppress warnings. The LAZY_STREAM
456 // parameter doesn't reference 'condition' in /analyze builds because
457 // this evaluation confuses /analyze. The !! before condition is because
458 // __analysis_assume gets confused on some conditions:
459 // http://randomascii.wordpress.com/2011/09/13/analyze-for-visual-studio-the-ugl y-part-5/
460
461 #define CHECK(condition) \
462 __analysis_assume(!!(condition)), \
463 LAZY_STREAM(LOG_STREAM(FATAL), false) \
464 << "Check failed: " #condition ". "
465
466 #define PCHECK(condition) \
467 __analysis_assume(!!(condition)), \
468 LAZY_STREAM(PLOG_STREAM(FATAL), false) \
469 << "Check failed: " #condition ". "
470
471 #else // _PREFAST_
472
473 #define CHECK(condition) \ 424 #define CHECK(condition) \
474 LAZY_STREAM(LOG_STREAM(FATAL), !(condition)) \ 425 LAZY_STREAM(LOG_STREAM(FATAL), !(condition)) \
475 << "Check failed: " #condition ". " 426 << "Check failed: " #condition ". "
476 427
477 #define PCHECK(condition) \ 428 #define PCHECK(condition) \
478 LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \ 429 LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \
479 << "Check failed: " #condition ". " 430 << "Check failed: " #condition ". "
480 431
481 #endif // _PREFAST_
482
483 // Helper macro for binary operators. 432 // Helper macro for binary operators.
484 // Don't use this macro directly in your code, use CHECK_EQ et al below. 433 // Don't use this macro directly in your code, use CHECK_EQ et al below.
485 // 434 //
486 // TODO(akalin): Rewrite this so that constructs like if (...) 435 // TODO(akalin): Rewrite this so that constructs like if (...)
487 // CHECK_EQ(...) else { ... } work properly. 436 // CHECK_EQ(...) else { ... } work properly.
488 #define CHECK_OP(name, op, val1, val2) \ 437 #define CHECK_OP(name, op, val1, val2) \
489 if (std::string* _result = \ 438 if (std::string* _result = \
490 logging::Check##name##Impl((val1), (val2), \ 439 logging::Check##name##Impl((val1), (val2), \
491 #val1 " " #op " " #val2)) \ 440 #val1 " " #op " " #val2)) \
492 logging::LogMessage(__FILE__, __LINE__, _result).stream() 441 logging::LogMessage(__FILE__, __LINE__, _result).stream()
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_INFO 580 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_INFO
632 const LogSeverity LOG_DCHECK = LOG_INFO; 581 const LogSeverity LOG_DCHECK = LOG_INFO;
633 582
634 #endif // DCHECK_IS_ON() 583 #endif // DCHECK_IS_ON()
635 584
636 // DCHECK et al. make sure to reference |condition| regardless of 585 // DCHECK et al. make sure to reference |condition| regardless of
637 // whether DCHECKs are enabled; this is so that we don't get unused 586 // whether DCHECKs are enabled; this is so that we don't get unused
638 // variable warnings if the only use of a variable is in a DCHECK. 587 // variable warnings if the only use of a variable is in a DCHECK.
639 // This behavior is different from DLOG_IF et al. 588 // This behavior is different from DLOG_IF et al.
640 589
641 #if defined(_PREFAST_) && defined(OS_WIN)
642 // See comments on the previous use of __analysis_assume.
643
644 #define DCHECK(condition) \
645 __analysis_assume(!!(condition)), \
646 LAZY_STREAM(LOG_STREAM(DCHECK), false) \
647 << "Check failed: " #condition ". "
648
649 #define DPCHECK(condition) \
650 __analysis_assume(!!(condition)), \
651 LAZY_STREAM(PLOG_STREAM(DCHECK), false) \
652 << "Check failed: " #condition ". "
653
654 #else // _PREFAST_
655
656 #define DCHECK(condition) \ 590 #define DCHECK(condition) \
657 LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \ 591 LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \
658 << "Check failed: " #condition ". " 592 << "Check failed: " #condition ". "
659 593
660 #define DPCHECK(condition) \ 594 #define DPCHECK(condition) \
661 LAZY_STREAM(PLOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \ 595 LAZY_STREAM(PLOG_STREAM(DCHECK), DCHECK_IS_ON() ? !(condition) : false) \
662 << "Check failed: " #condition ". " 596 << "Check failed: " #condition ". "
663 597
664 #endif // _PREFAST_
665
666 // Helper macro for binary operators. 598 // Helper macro for binary operators.
667 // Don't use this macro directly in your code, use DCHECK_EQ et al below. 599 // Don't use this macro directly in your code, use DCHECK_EQ et al below.
668 #define DCHECK_OP(name, op, val1, val2) \ 600 #define DCHECK_OP(name, op, val1, val2) \
669 if (DCHECK_IS_ON()) \ 601 if (DCHECK_IS_ON()) \
670 if (std::string* _result = logging::Check##name##Impl( \ 602 if (std::string* _result = logging::Check##name##Impl( \
671 (val1), (val2), #val1 " " #op " " #val2)) \ 603 (val1), (val2), #val1 " " #op " " #val2)) \
672 logging::LogMessage(__FILE__, __LINE__, ::logging::LOG_DCHECK, _result) \ 604 logging::LogMessage(__FILE__, __LINE__, ::logging::LOG_DCHECK, _result) \
673 .stream() 605 .stream()
674 606
675 // Equality/Inequality checks - compare two values, and log a 607 // Equality/Inequality checks - compare two values, and log a
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 void Init(const char* file, int line); 675 void Init(const char* file, int line);
744 676
745 LogSeverity severity_; 677 LogSeverity severity_;
746 std::ostringstream stream_; 678 std::ostringstream stream_;
747 size_t message_start_; // Offset of the start of the message (past prefix 679 size_t message_start_; // Offset of the start of the message (past prefix
748 // info). 680 // info).
749 // The file and line information passed in to the constructor. 681 // The file and line information passed in to the constructor.
750 const char* file_; 682 const char* file_;
751 const int line_; 683 const int line_;
752 684
753 #if defined(OS_WIN)
754 // Stores the current value of GetLastError in the constructor and restores
755 // it in the destructor by calling SetLastError.
756 // This is useful since the LogMessage class uses a lot of Win32 calls
757 // that will lose the value of GLE and the code that called the log function
758 // will have lost the thread error value when the log call returns.
759 class SaveLastError {
760 public:
761 SaveLastError();
762 ~SaveLastError();
763
764 unsigned long get_error() const { return last_error_; }
765
766 protected:
767 unsigned long last_error_;
768 };
769
770 SaveLastError last_error_;
771 #endif
772
773 DISALLOW_COPY_AND_ASSIGN(LogMessage); 685 DISALLOW_COPY_AND_ASSIGN(LogMessage);
774 }; 686 };
775 687
776 // A non-macro interface to the log facility; (useful 688 // A non-macro interface to the log facility; (useful
777 // when the logging level is not a compile-time constant). 689 // when the logging level is not a compile-time constant).
778 inline void LogAtLevel(int const log_level, std::string const &msg) { 690 inline void LogAtLevel(int const log_level, std::string const &msg) {
779 LogMessage(__FILE__, __LINE__, log_level).stream() << msg; 691 LogMessage(__FILE__, __LINE__, log_level).stream() << msg;
780 } 692 }
781 693
782 // This class is used to explicitly ignore values in the conditional 694 // This class is used to explicitly ignore values in the conditional
783 // logging macros. This avoids compiler warnings like "value computed 695 // logging macros. This avoids compiler warnings like "value computed
784 // is not used" and "statement has no effect". 696 // is not used" and "statement has no effect".
785 class LogMessageVoidify { 697 class LogMessageVoidify {
786 public: 698 public:
787 LogMessageVoidify() { } 699 LogMessageVoidify() { }
788 // This has to be an operator with a precedence lower than << but 700 // This has to be an operator with a precedence lower than << but
789 // higher than ?: 701 // higher than ?:
790 void operator&(std::ostream&) { } 702 void operator&(std::ostream&) { }
791 }; 703 };
792 704
793 #if defined(OS_WIN) 705 #if defined(OS_POSIX)
794 typedef unsigned long SystemErrorCode;
795 #elif defined(OS_POSIX)
796 typedef int SystemErrorCode; 706 typedef int SystemErrorCode;
797 #endif 707 #endif
798 708
799 // Alias for ::GetLastError() on Windows and errno on POSIX. Avoids having to 709 // Alias for ::GetLastError() on Windows and errno on POSIX. Avoids having to
800 // pull in windows.h just for GetLastError() and DWORD. 710 // pull in windows.h just for GetLastError() and DWORD.
801 BASE_EXPORT SystemErrorCode GetLastSystemErrorCode(); 711 BASE_EXPORT SystemErrorCode GetLastSystemErrorCode();
802 BASE_EXPORT std::string SystemErrorCodeToString(SystemErrorCode error_code); 712 BASE_EXPORT std::string SystemErrorCodeToString(SystemErrorCode error_code);
803 713
804 #if defined(OS_WIN) 714 #if defined(OS_POSIX)
805 // Appends a formatted system message of the GetLastError() type.
806 class BASE_EXPORT Win32ErrorLogMessage {
807 public:
808 Win32ErrorLogMessage(const char* file,
809 int line,
810 LogSeverity severity,
811 SystemErrorCode err);
812
813 // Appends the error message before destructing the encapsulated class.
814 ~Win32ErrorLogMessage();
815
816 std::ostream& stream() { return log_message_.stream(); }
817
818 private:
819 SystemErrorCode err_;
820 LogMessage log_message_;
821
822 DISALLOW_COPY_AND_ASSIGN(Win32ErrorLogMessage);
823 };
824 #elif defined(OS_POSIX)
825 // Appends a formatted system message of the errno type 715 // Appends a formatted system message of the errno type
826 class BASE_EXPORT ErrnoLogMessage { 716 class BASE_EXPORT ErrnoLogMessage {
827 public: 717 public:
828 ErrnoLogMessage(const char* file, 718 ErrnoLogMessage(const char* file,
829 int line, 719 int line,
830 LogSeverity severity, 720 LogSeverity severity,
831 SystemErrorCode err); 721 SystemErrorCode err);
832 722
833 // Appends the error message before destructing the encapsulated class. 723 // Appends the error message before destructing the encapsulated class.
834 ~ErrnoLogMessage(); 724 ~ErrnoLogMessage();
835 725
836 std::ostream& stream() { return log_message_.stream(); } 726 std::ostream& stream() { return log_message_.stream(); }
837 727
838 private: 728 private:
839 SystemErrorCode err_; 729 SystemErrorCode err_;
840 LogMessage log_message_; 730 LogMessage log_message_;
841 731
842 DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage); 732 DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage);
843 }; 733 };
844 #endif // OS_WIN 734 #endif // OS_POSIX
845 735
846 // Closes the log file explicitly if open. 736 // Closes the log file explicitly if open.
847 // NOTE: Since the log file is opened as necessary by the action of logging 737 // NOTE: Since the log file is opened as necessary by the action of logging
848 // statements, there's no guarantee that it will stay closed 738 // statements, there's no guarantee that it will stay closed
849 // after this call. 739 // after this call.
850 BASE_EXPORT void CloseLogFile(); 740 BASE_EXPORT void CloseLogFile();
851 741
852 // Async signal safe logging mechanism. 742 // Async signal safe logging mechanism.
853 BASE_EXPORT void RawLog(int level, const char* message); 743 BASE_EXPORT void RawLog(int level, const char* message);
854 744
855 #define RAW_LOG(level, message) logging::RawLog(logging::LOG_ ## level, message) 745 #define RAW_LOG(level, message) logging::RawLog(logging::LOG_ ## level, message)
856 746
857 #define RAW_CHECK(condition) \ 747 #define RAW_CHECK(condition) \
858 do { \ 748 do { \
859 if (!(condition)) \ 749 if (!(condition)) \
860 logging::RawLog(logging::LOG_FATAL, "Check failed: " #condition "\n"); \ 750 logging::RawLog(logging::LOG_FATAL, "Check failed: " #condition "\n"); \
861 } while (0) 751 } while (0)
862 752
863 #if defined(OS_WIN)
864 // Returns the default log file path.
865 BASE_EXPORT std::wstring GetLogFileFullPath();
866 #endif
867
868 } // namespace logging 753 } // namespace logging
869 754
870 // Note that "The behavior of a C++ program is undefined if it adds declarations 755 // Note that "The behavior of a C++ program is undefined if it adds declarations
871 // or definitions to namespace std or to a namespace within namespace std unless 756 // or definitions to namespace std or to a namespace within namespace std unless
872 // otherwise specified." --C++11[namespace.std] 757 // otherwise specified." --C++11[namespace.std]
873 // 758 //
874 // We've checked that this particular definition has the intended behavior on 759 // We've checked that this particular definition has the intended behavior on
875 // our implementations, but it's prone to breaking in the future, and please 760 // our implementations, but it's prone to breaking in the future, and please
876 // don't imitate this in your own definitions without checking with some 761 // don't imitate this in your own definitions without checking with some
877 // standard library experts. 762 // standard library experts.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 #elif NOTIMPLEMENTED_POLICY == 5 815 #elif NOTIMPLEMENTED_POLICY == 5
931 #define NOTIMPLEMENTED() do {\ 816 #define NOTIMPLEMENTED() do {\
932 static bool logged_once = false;\ 817 static bool logged_once = false;\
933 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\ 818 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\
934 logged_once = true;\ 819 logged_once = true;\
935 } while(0);\ 820 } while(0);\
936 EAT_STREAM_PARAMETERS 821 EAT_STREAM_PARAMETERS
937 #endif 822 #endif
938 823
939 #endif // BASE_LOGGING_H_ 824 #endif // BASE_LOGGING_H_
OLDNEW
« no previous file with comments | « base/json/json_writer_unittest.cc ('k') | base/logging.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698