X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fwindows%2Fglog%2Flogging.h;h=e72c0884d40370338643959c6b3394fc639d3499;hb=8ed1668cdb57a9390c2134f3bf9b87e28737064f;hp=bab8c612500d25928b4f0cd59987a2e0b3aadfa0;hpb=a0073e504be20faa7e9c3b31ba795bdcfb99c967;p=platform%2Fupstream%2Fglog.git diff --git a/src/windows/glog/logging.h b/src/windows/glog/logging.h index bab8c61..e72c088 100755 --- a/src/windows/glog/logging.h +++ b/src/windows/glog/logging.h @@ -52,14 +52,6 @@ #endif #include -// Annoying stuff for windows -- makes sure clients can import these functions -#ifndef GOOGLE_GLOG_DLL_DECL -# if defined(_WIN32) && !defined(__CYGWIN__) -# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) -# else -# define GOOGLE_GLOG_DLL_DECL -# endif -#endif #if defined(_MSC_VER) #define GLOG_MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ __pragma(warning(disable:n)) @@ -69,6 +61,15 @@ #define GLOG_MSVC_POP_WARNING() #endif +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + // We care a lot about number of bits things take up. Unfortunately, // systems define their bit-specific ints in a lot of different ways. // We use our own way, and have a typedef to get there. @@ -133,15 +134,28 @@ typedef unsigned __int64 uint64; #ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN #if 0 #define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0)) -#define GOOGLE_PREDICT_FALSE(x) (__builtin_expect(x, 0)) -#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #else #define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x +#endif +#endif + +#ifndef GOOGLE_PREDICT_FALSE +#if 0 +#define GOOGLE_PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#else #define GOOGLE_PREDICT_FALSE(x) x +#endif +#endif + +#ifndef GOOGLE_PREDICT_TRUE +#if 0 +#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#else #define GOOGLE_PREDICT_TRUE(x) x #endif #endif + // Make a bunch of macros for logging. The way to log things is to stream // things to LOG(). E.g., // @@ -351,6 +365,9 @@ DECLARE_int32(minloglevel); // default logging directory. DECLARE_string(log_dir); +// Set the log file mode. +DECLARE_int32(logfile_mode); + // Sets the path of the directory into which to put additional links // to the log files. DECLARE_string(log_link); @@ -418,9 +435,15 @@ DECLARE_bool(stop_logging_if_full_disk); #define LOG_TO_STRING_FATAL(message) google::NullStreamFatal() #endif +#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) +#define DCHECK_IS_ON() 0 +#else +#define DCHECK_IS_ON() 1 +#endif + // For DFATAL, we want to use LogMessage (as opposed to // LogMessageFatal), to be consistent with the original behavior. -#ifdef NDEBUG +#if !DCHECK_IS_ON() #define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR #elif GOOGLE_STRIP_LOG <= 3 #define COMPACT_GOOGLE_LOG_DFATAL google::LogMessage( \ @@ -546,7 +569,7 @@ class LogSink; // defined below // vector *outvec; // The cast is to disambiguate NULL arguments. #define LOG_STRING(severity, outvec) \ - LOG_TO_STRING_##severity(static_cast*>(outvec)).stream() + LOG_TO_STRING_##severity(static_cast*>(outvec)).stream() #define LOG_IF(severity, condition) \ !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity) @@ -559,7 +582,7 @@ class LogSink; // defined below SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition // CHECK dies with a fatal error if condition is not true. It is *not* -// controlled by NDEBUG, so the check will be executed regardless of +// controlled by DCHECK_IS_ON(), so the check will be executed regardless of // compilation mode. Therefore, it is safe to do things like: // CHECK(fp->Write(x) == 4) #define CHECK(condition) \ @@ -709,15 +732,15 @@ DEFINE_CHECK_OP_IMPL(Check_GT, > ) #if defined(STATIC_ANALYSIS) // Only for static analysis tool to know that it is equivalent to assert #define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2)) -#elif !defined(NDEBUG) +#elif DCHECK_IS_ON() // In debug mode, avoid constructing CheckOpStrings if possible, // to reduce the overhead of CHECK statments by 2x. // Real DCHECK-heavy tests have seen 1.5x speedups. -// The meaning of "string" might be different between now and +// The meaning of "string" might be different between now and // when this macro gets invoked (e.g., if someone is experimenting // with other string implementations that get defined after this -// file is included). Save the current meaning now and use it +// file is included). Save the current meaning now and use it // in the macro. typedef std::string _Check_string; #define CHECK_OP_LOG(name, op, val1, val2, log) \ @@ -738,7 +761,7 @@ typedef std::string _Check_string; google::GetReferenceableValue(val2), \ #val1 " " #op " " #val2)) \ log(__FILE__, __LINE__, _result).stream() -#endif // STATIC_ANALYSIS, !NDEBUG +#endif // STATIC_ANALYSIS, DCHECK_IS_ON() #if GOOGLE_STRIP_LOG <= 3 #define CHECK_OP(name, op, val1, val2) \ @@ -910,6 +933,9 @@ template struct CompileAssert { }; struct CrashReason; + +// Returns true if FailureSignalHandler is installed. +bool IsFailureSignalHandlerInstalled(); } // namespace glog_internal_namespace_ #define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \ @@ -960,7 +986,7 @@ const LogSeverity GLOG_0 = GLOG_ERROR; // Plus some debug-logging macros that get compiled to nothing for production -#ifndef NDEBUG +#if DCHECK_IS_ON() #define DLOG(severity) LOG(severity) #define DVLOG(verboselevel) VLOG(verboselevel) @@ -970,7 +996,7 @@ const LogSeverity GLOG_0 = GLOG_ERROR; LOG_IF_EVERY_N(severity, condition, n) #define DLOG_ASSERT(condition) LOG_ASSERT(condition) -// debug-only checking. not executed in NDEBUG mode. +// debug-only checking. executed if DCHECK_IS_ON(). #define DCHECK(condition) CHECK(condition) #define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2) #define DCHECK_NE(val1, val2) CHECK_NE(val1, val2) @@ -984,7 +1010,7 @@ const LogSeverity GLOG_0 = GLOG_ERROR; #define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2) #define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2) -#else // NDEBUG +#else // !DCHECK_IS_ON() #define DLOG(severity) \ true ? (void) 0 : google::LogMessageVoidify() & LOG(severity) @@ -1065,7 +1091,7 @@ const LogSeverity GLOG_0 = GLOG_ERROR; while (false) \ GLOG_MSVC_POP_WARNING() CHECK_STRCASENE(str1, str2) -#endif // NDEBUG +#endif // DCHECK_IS_ON() // Log only in verbose mode. @@ -1091,6 +1117,12 @@ class GOOGLE_GLOG_DLL_DECL LogStreamBuf : public std::streambuf { LogStreamBuf(char *buf, int len) { setp(buf, buf + len - 2); } + + // Resets the buffer. Useful if we reuse it by means of TLS. + void reset() { + setp(pbase(), epptr()); + } + // This effectively ignores overflow. virtual int_type overflow(int_type ch) { return ch; @@ -1153,8 +1185,11 @@ public: size_t pcount() const { return streambuf_.pcount(); } char* pbase() const { return streambuf_.pbase(); } char* str() const { return pbase(); } + void reset() { streambuf_.reset(); } private: + LogStream(const LogStream&); + LogStream& operator=(const LogStream&); base_logging::LogStreamBuf streambuf_; int ctr_; // Counter hack (for the LOG_EVERY_X() macro) LogStream *self_; // Consistency check hack @@ -1222,7 +1257,7 @@ public: void SendToSyslogAndLog(); // Actually dispatch to syslog and the logs // Call abort() or similar to perform LOG(FATAL) crash. - static void Fail() ; + static void __declspec(noreturn) Fail(); std::ostream& stream(); @@ -1270,7 +1305,7 @@ class GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage { public: LogMessageFatal(const char* file, int line); LogMessageFatal(const char* file, int line, const CheckOpString& result); - ~LogMessageFatal() ; + __declspec(noreturn) ~LogMessageFatal(); }; // A non-macro interface to the log facility; (useful @@ -1285,6 +1320,35 @@ inline void LogAtLevel(int const severity, std::string const &msg) { // LOG macros, 2. this macro can be used as C++ stream. #define LOG_AT_LEVEL(severity) google::LogMessage(__FILE__, __LINE__, severity).stream() +// Check if it's compiled in C++11 mode. +// +// GXX_EXPERIMENTAL_CXX0X is defined by gcc and clang up to at least +// gcc-4.7 and clang-3.1 (2011-12-13). __cplusplus was defined to 1 +// in gcc before 4.7 (Crosstool 16) and clang before 3.1, but is +// defined according to the language version in effect thereafter. +// Microsoft Visual Studio 14 (2015) sets __cplusplus==199711 despite +// reasonably good C++11 support, so we set LANG_CXX for it and +// newer versions (_MSC_VER >= 1900). +#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \ + (defined(_MSC_VER) && _MSC_VER >= 1900)) +// Helper for CHECK_NOTNULL(). +// +// In C++11, all cases can be handled by a single function. Since the value +// category of the argument is preserved (also for rvalue references), +// member initializer lists like the one below will compile correctly: +// +// Foo() +// : x_(CHECK_NOTNULL(MethodReturningUniquePtr())) {} +template +T CheckNotNull(const char* file, int line, const char* names, T&& t) { + if (t == nullptr) { + LogMessageFatal(file, line, new std::string(names)); + } + return std::forward(t); +} + +#else + // A small helper for CHECK_NOTNULL(). template T* CheckNotNull(const char *file, int line, const char *names, T* t) { @@ -1293,6 +1357,7 @@ T* CheckNotNull(const char *file, int line, const char *names, T* t) { } return t; } +#endif // Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This // only works if ostream is a LogStream. If the ostream is not a @@ -1574,7 +1639,7 @@ class GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream { NullStreamFatal() { } NullStreamFatal(const char* file, int line, const CheckOpString& result) : NullStream(file, line, result) { } - ~NullStreamFatal() { _exit(1); } + __declspec(noreturn) ~NullStreamFatal() throw () { _exit(1); } }; // Install a signal handler that will dump signal information and a stack