| 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 #ifndef BASE_LOGGING_H_ | 5 #ifndef BASE_LOGGING_H_ |
| 6 #define BASE_LOGGING_H_ | 6 #define BASE_LOGGING_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <cassert> | 9 #include <cassert> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <cstring> | 11 #include <cstring> |
| 12 #include <sstream> | 12 #include <sstream> |
| 13 | 13 |
| 14 #include "base/base_api.h" | 14 #include "base/base_export.h" |
| 15 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
| 16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 17 | 17 |
| 18 // | 18 // |
| 19 // Optional message capabilities | 19 // Optional message capabilities |
| 20 // ----------------------------- | 20 // ----------------------------- |
| 21 // Assertion failed messages and fatal errors are displayed in a dialog box | 21 // Assertion failed messages and fatal errors are displayed in a dialog box |
| 22 // before the application exits. However, running this UI creates a message | 22 // before the application exits. However, running this UI creates a message |
| 23 // loop, which causes application messages to be processed and potentially | 23 // loop, which causes application messages to be processed and potentially |
| 24 // dispatched to existing application windows. Since the application is in a | 24 // dispatched to existing application windows. Since the application is in a |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 // or vice versa. | 186 // or vice versa. |
| 187 #if NDEBUG | 187 #if NDEBUG |
| 188 #define BaseInitLoggingImpl BaseInitLoggingImpl_built_with_NDEBUG | 188 #define BaseInitLoggingImpl BaseInitLoggingImpl_built_with_NDEBUG |
| 189 #else | 189 #else |
| 190 #define BaseInitLoggingImpl BaseInitLoggingImpl_built_without_NDEBUG | 190 #define BaseInitLoggingImpl BaseInitLoggingImpl_built_without_NDEBUG |
| 191 #endif | 191 #endif |
| 192 | 192 |
| 193 // Implementation of the InitLogging() method declared below. We use a | 193 // Implementation of the InitLogging() method declared below. We use a |
| 194 // more-specific name so we can #define it above without affecting other code | 194 // more-specific name so we can #define it above without affecting other code |
| 195 // that has named stuff "InitLogging". | 195 // that has named stuff "InitLogging". |
| 196 BASE_API bool BaseInitLoggingImpl(const PathChar* log_file, | 196 BASE_EXPORT bool BaseInitLoggingImpl(const PathChar* log_file, |
| 197 LoggingDestination logging_dest, | 197 LoggingDestination logging_dest, |
| 198 LogLockingState lock_log, | 198 LogLockingState lock_log, |
| 199 OldFileDeletionState delete_old, | 199 OldFileDeletionState delete_old, |
| 200 DcheckState dcheck_state); | 200 DcheckState dcheck_state); |
| 201 | 201 |
| 202 // Sets the log file name and other global logging state. Calling this function | 202 // Sets the log file name and other global logging state. Calling this function |
| 203 // is recommended, and is normally done at the beginning of application init. | 203 // is recommended, and is normally done at the beginning of application init. |
| 204 // If you don't call it, all the flags will be initialized to their default | 204 // If you don't call it, all the flags will be initialized to their default |
| 205 // values, and there is a race condition that may leak a critical section | 205 // values, and there is a race condition that may leak a critical section |
| 206 // object if two threads try to do the first log at the same time. | 206 // object if two threads try to do the first log at the same time. |
| 207 // See the definition of the enums above for descriptions and default values. | 207 // See the definition of the enums above for descriptions and default values. |
| 208 // | 208 // |
| 209 // The default log file is initialized to "debug.log" in the application | 209 // The default log file is initialized to "debug.log" in the application |
| 210 // directory. You probably don't want this, especially since the program | 210 // directory. You probably don't want this, especially since the program |
| 211 // directory may not be writable on an enduser's system. | 211 // directory may not be writable on an enduser's system. |
| 212 inline bool InitLogging(const PathChar* log_file, | 212 inline bool InitLogging(const PathChar* log_file, |
| 213 LoggingDestination logging_dest, | 213 LoggingDestination logging_dest, |
| 214 LogLockingState lock_log, | 214 LogLockingState lock_log, |
| 215 OldFileDeletionState delete_old, | 215 OldFileDeletionState delete_old, |
| 216 DcheckState dcheck_state) { | 216 DcheckState dcheck_state) { |
| 217 return BaseInitLoggingImpl(log_file, logging_dest, lock_log, | 217 return BaseInitLoggingImpl(log_file, logging_dest, lock_log, |
| 218 delete_old, dcheck_state); | 218 delete_old, dcheck_state); |
| 219 } | 219 } |
| 220 | 220 |
| 221 // Sets the log level. Anything at or above this level will be written to the | 221 // Sets the log level. Anything at or above this level will be written to the |
| 222 // log file/displayed to the user (if applicable). Anything below this level | 222 // log file/displayed to the user (if applicable). Anything below this level |
| 223 // will be silently ignored. The log level defaults to 0 (everything is logged | 223 // will be silently ignored. The log level defaults to 0 (everything is logged |
| 224 // up to level INFO) if this function is not called. | 224 // up to level INFO) if this function is not called. |
| 225 // Note that log messages for VLOG(x) are logged at level -x, so setting | 225 // Note that log messages for VLOG(x) are logged at level -x, so setting |
| 226 // the min log level to negative values enables verbose logging. | 226 // the min log level to negative values enables verbose logging. |
| 227 BASE_API void SetMinLogLevel(int level); | 227 BASE_EXPORT void SetMinLogLevel(int level); |
| 228 | 228 |
| 229 // Gets the current log level. | 229 // Gets the current log level. |
| 230 BASE_API int GetMinLogLevel(); | 230 BASE_EXPORT int GetMinLogLevel(); |
| 231 | 231 |
| 232 // Gets the VLOG default verbosity level. | 232 // Gets the VLOG default verbosity level. |
| 233 BASE_API int GetVlogVerbosity(); | 233 BASE_EXPORT int GetVlogVerbosity(); |
| 234 | 234 |
| 235 // Gets the current vlog level for the given file (usually taken from | 235 // Gets the current vlog level for the given file (usually taken from |
| 236 // __FILE__). | 236 // __FILE__). |
| 237 | 237 |
| 238 // Note that |N| is the size *with* the null terminator. | 238 // Note that |N| is the size *with* the null terminator. |
| 239 BASE_API int GetVlogLevelHelper(const char* file_start, size_t N); | 239 BASE_EXPORT int GetVlogLevelHelper(const char* file_start, size_t N); |
| 240 | 240 |
| 241 template <size_t N> | 241 template <size_t N> |
| 242 int GetVlogLevel(const char (&file)[N]) { | 242 int GetVlogLevel(const char (&file)[N]) { |
| 243 return GetVlogLevelHelper(file, N); | 243 return GetVlogLevelHelper(file, N); |
| 244 } | 244 } |
| 245 | 245 |
| 246 // Sets the common items you want to be prepended to each log message. | 246 // Sets the common items you want to be prepended to each log message. |
| 247 // process and thread IDs default to off, the timestamp defaults to on. | 247 // process and thread IDs default to off, the timestamp defaults to on. |
| 248 // If this function is not called, logging defaults to writing the timestamp | 248 // If this function is not called, logging defaults to writing the timestamp |
| 249 // only. | 249 // only. |
| 250 BASE_API void SetLogItems(bool enable_process_id, bool enable_thread_id, | 250 BASE_EXPORT void SetLogItems(bool enable_process_id, bool enable_thread_id, |
| 251 bool enable_timestamp, bool enable_tickcount); | 251 bool enable_timestamp, bool enable_tickcount); |
| 252 | 252 |
| 253 // Sets whether or not you'd like to see fatal debug messages popped up in | 253 // Sets whether or not you'd like to see fatal debug messages popped up in |
| 254 // a dialog box or not. | 254 // a dialog box or not. |
| 255 // Dialogs are not shown by default. | 255 // Dialogs are not shown by default. |
| 256 BASE_API void SetShowErrorDialogs(bool enable_dialogs); | 256 BASE_EXPORT void SetShowErrorDialogs(bool enable_dialogs); |
| 257 | 257 |
| 258 // Sets the Log Assert Handler that will be used to notify of check failures. | 258 // Sets the Log Assert Handler that will be used to notify of check failures. |
| 259 // The default handler shows a dialog box and then terminate the process, | 259 // The default handler shows a dialog box and then terminate the process, |
| 260 // however clients can use this function to override with their own handling | 260 // however clients can use this function to override with their own handling |
| 261 // (e.g. a silent one for Unit Tests) | 261 // (e.g. a silent one for Unit Tests) |
| 262 typedef void (*LogAssertHandlerFunction)(const std::string& str); | 262 typedef void (*LogAssertHandlerFunction)(const std::string& str); |
| 263 BASE_API void SetLogAssertHandler(LogAssertHandlerFunction handler); | 263 BASE_EXPORT void SetLogAssertHandler(LogAssertHandlerFunction handler); |
| 264 | 264 |
| 265 // Sets the Log Report Handler that will be used to notify of check failures | 265 // Sets the Log Report Handler that will be used to notify of check failures |
| 266 // in non-debug mode. The default handler shows a dialog box and continues | 266 // in non-debug mode. The default handler shows a dialog box and continues |
| 267 // the execution, however clients can use this function to override with their | 267 // the execution, however clients can use this function to override with their |
| 268 // own handling. | 268 // own handling. |
| 269 typedef void (*LogReportHandlerFunction)(const std::string& str); | 269 typedef void (*LogReportHandlerFunction)(const std::string& str); |
| 270 BASE_API void SetLogReportHandler(LogReportHandlerFunction handler); | 270 BASE_EXPORT void SetLogReportHandler(LogReportHandlerFunction handler); |
| 271 | 271 |
| 272 // Sets the Log Message Handler that gets passed every log message before | 272 // Sets the Log Message Handler that gets passed every log message before |
| 273 // it's sent to other log destinations (if any). | 273 // it's sent to other log destinations (if any). |
| 274 // Returns true to signal that it handled the message and the message | 274 // Returns true to signal that it handled the message and the message |
| 275 // should not be sent to other log destinations. | 275 // should not be sent to other log destinations. |
| 276 typedef bool (*LogMessageHandlerFunction)(int severity, | 276 typedef bool (*LogMessageHandlerFunction)(int severity, |
| 277 const char* file, int line, size_t message_start, const std::string& str); | 277 const char* file, int line, size_t message_start, const std::string& str); |
| 278 BASE_API void SetLogMessageHandler(LogMessageHandlerFunction handler); | 278 BASE_EXPORT void SetLogMessageHandler(LogMessageHandlerFunction handler); |
| 279 BASE_API LogMessageHandlerFunction GetLogMessageHandler(); | 279 BASE_EXPORT LogMessageHandlerFunction GetLogMessageHandler(); |
| 280 | 280 |
| 281 typedef int LogSeverity; | 281 typedef int LogSeverity; |
| 282 const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity | 282 const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity |
| 283 // Note: the log severities are used to index into the array of names, | 283 // Note: the log severities are used to index into the array of names, |
| 284 // see log_severity_names. | 284 // see log_severity_names. |
| 285 const LogSeverity LOG_INFO = 0; | 285 const LogSeverity LOG_INFO = 0; |
| 286 const LogSeverity LOG_WARNING = 1; | 286 const LogSeverity LOG_WARNING = 1; |
| 287 const LogSeverity LOG_ERROR = 2; | 287 const LogSeverity LOG_ERROR = 2; |
| 288 const LogSeverity LOG_ERROR_REPORT = 3; | 288 const LogSeverity LOG_ERROR_REPORT = 3; |
| 289 const LogSeverity LOG_FATAL = 4; | 289 const LogSeverity LOG_FATAL = 4; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 // Definitions for DCHECK et al. | 616 // Definitions for DCHECK et al. |
| 617 | 617 |
| 618 #if ENABLE_DCHECK | 618 #if ENABLE_DCHECK |
| 619 | 619 |
| 620 #if defined(NDEBUG) | 620 #if defined(NDEBUG) |
| 621 | 621 |
| 622 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ | 622 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ |
| 623 COMPACT_GOOGLE_LOG_EX_ERROR_REPORT(ClassName , ##__VA_ARGS__) | 623 COMPACT_GOOGLE_LOG_EX_ERROR_REPORT(ClassName , ##__VA_ARGS__) |
| 624 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_ERROR_REPORT | 624 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_ERROR_REPORT |
| 625 const LogSeverity LOG_DCHECK = LOG_ERROR_REPORT; | 625 const LogSeverity LOG_DCHECK = LOG_ERROR_REPORT; |
| 626 BASE_API extern DcheckState g_dcheck_state; | 626 BASE_EXPORT extern DcheckState g_dcheck_state; |
| 627 #define DCHECK_IS_ON() \ | 627 #define DCHECK_IS_ON() \ |
| 628 ((::logging::g_dcheck_state == \ | 628 ((::logging::g_dcheck_state == \ |
| 629 ::logging::ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS) && \ | 629 ::logging::ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS) && \ |
| 630 LOG_IS_ON(DCHECK)) | 630 LOG_IS_ON(DCHECK)) |
| 631 | 631 |
| 632 #else // defined(NDEBUG) | 632 #else // defined(NDEBUG) |
| 633 | 633 |
| 634 // On a regular debug build, we want to have DCHECKs enabled. | 634 // On a regular debug build, we want to have DCHECKs enabled. |
| 635 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ | 635 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \ |
| 636 COMPACT_GOOGLE_LOG_EX_FATAL(ClassName , ##__VA_ARGS__) | 636 COMPACT_GOOGLE_LOG_EX_FATAL(ClassName , ##__VA_ARGS__) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 #define assert(x) DLOG_ASSERT(x) | 715 #define assert(x) DLOG_ASSERT(x) |
| 716 | 716 |
| 717 // This class more or less represents a particular log message. You | 717 // This class more or less represents a particular log message. You |
| 718 // create an instance of LogMessage and then stream stuff to it. | 718 // create an instance of LogMessage and then stream stuff to it. |
| 719 // When you finish streaming to it, ~LogMessage is called and the | 719 // When you finish streaming to it, ~LogMessage is called and the |
| 720 // full message gets streamed to the appropriate destination. | 720 // full message gets streamed to the appropriate destination. |
| 721 // | 721 // |
| 722 // You shouldn't actually use LogMessage's constructor to log things, | 722 // You shouldn't actually use LogMessage's constructor to log things, |
| 723 // though. You should use the LOG() macro (and variants thereof) | 723 // though. You should use the LOG() macro (and variants thereof) |
| 724 // above. | 724 // above. |
| 725 class BASE_API LogMessage { | 725 class BASE_EXPORT LogMessage { |
| 726 public: | 726 public: |
| 727 LogMessage(const char* file, int line, LogSeverity severity, int ctr); | 727 LogMessage(const char* file, int line, LogSeverity severity, int ctr); |
| 728 | 728 |
| 729 // Two special constructors that generate reduced amounts of code at | 729 // Two special constructors that generate reduced amounts of code at |
| 730 // LOG call sites for common cases. | 730 // LOG call sites for common cases. |
| 731 // | 731 // |
| 732 // Used for LOG(INFO): Implied are: | 732 // Used for LOG(INFO): Implied are: |
| 733 // severity = LOG_INFO, ctr = 0 | 733 // severity = LOG_INFO, ctr = 0 |
| 734 // | 734 // |
| 735 // Using this constructor instead of the more complex constructor above | 735 // Using this constructor instead of the more complex constructor above |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 }; | 809 }; |
| 810 | 810 |
| 811 #if defined(OS_WIN) | 811 #if defined(OS_WIN) |
| 812 typedef unsigned long SystemErrorCode; | 812 typedef unsigned long SystemErrorCode; |
| 813 #elif defined(OS_POSIX) | 813 #elif defined(OS_POSIX) |
| 814 typedef int SystemErrorCode; | 814 typedef int SystemErrorCode; |
| 815 #endif | 815 #endif |
| 816 | 816 |
| 817 // Alias for ::GetLastError() on Windows and errno on POSIX. Avoids having to | 817 // Alias for ::GetLastError() on Windows and errno on POSIX. Avoids having to |
| 818 // pull in windows.h just for GetLastError() and DWORD. | 818 // pull in windows.h just for GetLastError() and DWORD. |
| 819 BASE_API SystemErrorCode GetLastSystemErrorCode(); | 819 BASE_EXPORT SystemErrorCode GetLastSystemErrorCode(); |
| 820 | 820 |
| 821 #if defined(OS_WIN) | 821 #if defined(OS_WIN) |
| 822 // Appends a formatted system message of the GetLastError() type. | 822 // Appends a formatted system message of the GetLastError() type. |
| 823 class BASE_API Win32ErrorLogMessage { | 823 class BASE_EXPORT Win32ErrorLogMessage { |
| 824 public: | 824 public: |
| 825 Win32ErrorLogMessage(const char* file, | 825 Win32ErrorLogMessage(const char* file, |
| 826 int line, | 826 int line, |
| 827 LogSeverity severity, | 827 LogSeverity severity, |
| 828 SystemErrorCode err, | 828 SystemErrorCode err, |
| 829 const char* module); | 829 const char* module); |
| 830 | 830 |
| 831 Win32ErrorLogMessage(const char* file, | 831 Win32ErrorLogMessage(const char* file, |
| 832 int line, | 832 int line, |
| 833 LogSeverity severity, | 833 LogSeverity severity, |
| 834 SystemErrorCode err); | 834 SystemErrorCode err); |
| 835 | 835 |
| 836 // Appends the error message before destructing the encapsulated class. | 836 // Appends the error message before destructing the encapsulated class. |
| 837 ~Win32ErrorLogMessage(); | 837 ~Win32ErrorLogMessage(); |
| 838 | 838 |
| 839 std::ostream& stream() { return log_message_.stream(); } | 839 std::ostream& stream() { return log_message_.stream(); } |
| 840 | 840 |
| 841 private: | 841 private: |
| 842 SystemErrorCode err_; | 842 SystemErrorCode err_; |
| 843 // Optional name of the module defining the error. | 843 // Optional name of the module defining the error. |
| 844 const char* module_; | 844 const char* module_; |
| 845 LogMessage log_message_; | 845 LogMessage log_message_; |
| 846 | 846 |
| 847 DISALLOW_COPY_AND_ASSIGN(Win32ErrorLogMessage); | 847 DISALLOW_COPY_AND_ASSIGN(Win32ErrorLogMessage); |
| 848 }; | 848 }; |
| 849 #elif defined(OS_POSIX) | 849 #elif defined(OS_POSIX) |
| 850 // Appends a formatted system message of the errno type | 850 // Appends a formatted system message of the errno type |
| 851 class BASE_API ErrnoLogMessage { | 851 class BASE_EXPORT ErrnoLogMessage { |
| 852 public: | 852 public: |
| 853 ErrnoLogMessage(const char* file, | 853 ErrnoLogMessage(const char* file, |
| 854 int line, | 854 int line, |
| 855 LogSeverity severity, | 855 LogSeverity severity, |
| 856 SystemErrorCode err); | 856 SystemErrorCode err); |
| 857 | 857 |
| 858 // Appends the error message before destructing the encapsulated class. | 858 // Appends the error message before destructing the encapsulated class. |
| 859 ~ErrnoLogMessage(); | 859 ~ErrnoLogMessage(); |
| 860 | 860 |
| 861 std::ostream& stream() { return log_message_.stream(); } | 861 std::ostream& stream() { return log_message_.stream(); } |
| 862 | 862 |
| 863 private: | 863 private: |
| 864 SystemErrorCode err_; | 864 SystemErrorCode err_; |
| 865 LogMessage log_message_; | 865 LogMessage log_message_; |
| 866 | 866 |
| 867 DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage); | 867 DISALLOW_COPY_AND_ASSIGN(ErrnoLogMessage); |
| 868 }; | 868 }; |
| 869 #endif // OS_WIN | 869 #endif // OS_WIN |
| 870 | 870 |
| 871 // Closes the log file explicitly if open. | 871 // Closes the log file explicitly if open. |
| 872 // NOTE: Since the log file is opened as necessary by the action of logging | 872 // NOTE: Since the log file is opened as necessary by the action of logging |
| 873 // statements, there's no guarantee that it will stay closed | 873 // statements, there's no guarantee that it will stay closed |
| 874 // after this call. | 874 // after this call. |
| 875 BASE_API void CloseLogFile(); | 875 BASE_EXPORT void CloseLogFile(); |
| 876 | 876 |
| 877 // Async signal safe logging mechanism. | 877 // Async signal safe logging mechanism. |
| 878 BASE_API void RawLog(int level, const char* message); | 878 BASE_EXPORT void RawLog(int level, const char* message); |
| 879 | 879 |
| 880 #define RAW_LOG(level, message) logging::RawLog(logging::LOG_ ## level, message) | 880 #define RAW_LOG(level, message) logging::RawLog(logging::LOG_ ## level, message) |
| 881 | 881 |
| 882 #define RAW_CHECK(condition) \ | 882 #define RAW_CHECK(condition) \ |
| 883 do { \ | 883 do { \ |
| 884 if (!(condition)) \ | 884 if (!(condition)) \ |
| 885 logging::RawLog(logging::LOG_FATAL, "Check failed: " #condition "\n"); \ | 885 logging::RawLog(logging::LOG_FATAL, "Check failed: " #condition "\n"); \ |
| 886 } while (0) | 886 } while (0) |
| 887 | 887 |
| 888 } // namespace logging | 888 } // namespace logging |
| 889 | 889 |
| 890 // These functions are provided as a convenience for logging, which is where we | 890 // These functions are provided as a convenience for logging, which is where we |
| 891 // use streams (it is against Google style to use streams in other places). It | 891 // use streams (it is against Google style to use streams in other places). It |
| 892 // is designed to allow you to emit non-ASCII Unicode strings to the log file, | 892 // is designed to allow you to emit non-ASCII Unicode strings to the log file, |
| 893 // which is normally ASCII. It is relatively slow, so try not to use it for | 893 // which is normally ASCII. It is relatively slow, so try not to use it for |
| 894 // common cases. Non-ASCII characters will be converted to UTF-8 by these | 894 // common cases. Non-ASCII characters will be converted to UTF-8 by these |
| 895 // operators. | 895 // operators. |
| 896 BASE_API std::ostream& operator<<(std::ostream& out, const wchar_t* wstr); | 896 BASE_EXPORT std::ostream& operator<<(std::ostream& out, const wchar_t* wstr); |
| 897 inline std::ostream& operator<<(std::ostream& out, const std::wstring& wstr) { | 897 inline std::ostream& operator<<(std::ostream& out, const std::wstring& wstr) { |
| 898 return out << wstr.c_str(); | 898 return out << wstr.c_str(); |
| 899 } | 899 } |
| 900 | 900 |
| 901 // The NOTIMPLEMENTED() macro annotates codepaths which have | 901 // The NOTIMPLEMENTED() macro annotates codepaths which have |
| 902 // not been implemented yet. | 902 // not been implemented yet. |
| 903 // | 903 // |
| 904 // The implementation of this macro is controlled by NOTIMPLEMENTED_POLICY: | 904 // The implementation of this macro is controlled by NOTIMPLEMENTED_POLICY: |
| 905 // 0 -- Do nothing (stripped by compiler) | 905 // 0 -- Do nothing (stripped by compiler) |
| 906 // 1 -- Warn at compile time | 906 // 1 -- Warn at compile time |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 static int count = 0;\ | 938 static int count = 0;\ |
| 939 LOG_IF(ERROR, 0 == count++) << NOTIMPLEMENTED_MSG;\ | 939 LOG_IF(ERROR, 0 == count++) << NOTIMPLEMENTED_MSG;\ |
| 940 } while(0) | 940 } while(0) |
| 941 #endif | 941 #endif |
| 942 | 942 |
| 943 namespace base { | 943 namespace base { |
| 944 | 944 |
| 945 class StringPiece; | 945 class StringPiece; |
| 946 | 946 |
| 947 // Allows StringPiece to be logged. | 947 // Allows StringPiece to be logged. |
| 948 BASE_API std::ostream& operator<<(std::ostream& o, const StringPiece& piece); | 948 BASE_EXPORT std::ostream& operator<<(std::ostream& o, const StringPiece& piece); |
| 949 | 949 |
| 950 } // namespace base | 950 } // namespace base |
| 951 | 951 |
| 952 #endif // BASE_LOGGING_H_ | 952 #endif // BASE_LOGGING_H_ |
| OLD | NEW |