Index: third_party/tcmalloc/chromium/src/internal_logging.h |
diff --git a/third_party/tcmalloc/chromium/src/internal_logging.h b/third_party/tcmalloc/chromium/src/internal_logging.h |
index ce4a516d15bfb41accd3d906e26d45e6f3157532..02670346cbd0e4104d72f286168c731c482ef8ba 100644 |
--- a/third_party/tcmalloc/chromium/src/internal_logging.h |
+++ b/third_party/tcmalloc/chromium/src/internal_logging.h |
@@ -37,77 +37,79 @@ |
#include <config.h> |
#include <stddef.h> // for size_t |
+#if defined HAVE_STDINT_H |
+#include <stdint.h> |
+#elif defined HAVE_INTTYPES_H |
+#include <inttypes.h> |
+#else |
+#include <sys/types.h> |
+#endif |
//------------------------------------------------------------------- |
// Utility routines |
//------------------------------------------------------------------- |
-// Safe debugging routine: we write directly to the stderr file |
+// Safe logging helper: we write directly to the stderr file |
// descriptor and avoid FILE buffering because that may invoke |
-// malloc() |
-extern void TCMalloc_MESSAGE(const char* filename, |
- int line_number, |
- const char* format, ...) |
-#ifdef HAVE___ATTRIBUTE__ |
- __attribute__ ((__format__ (__printf__, 3, 4))) |
-#endif |
-; |
+// malloc(). |
+// |
+// Example: |
+// Log(kLog, __FILE__, __LINE__, "error", bytes); |
+ |
+namespace tcmalloc { |
+enum LogMode { |
+ kLog, // Just print the message |
+ kCrash, // Print the message and crash |
+ kCrashWithStats // Print the message, some stats, and crash |
+}; |
-// Right now, the only non-fatal messages we want to report are when |
-// an allocation fails (we'll return NULL eventually, but sometimes |
-// want more prominent notice to help debug). message should be |
-// a literal string with no %<whatever> format directives. |
-#ifdef TCMALLOC_WARNINGS |
-#define MESSAGE(message, num_bytes) \ |
- TCMalloc_MESSAGE(__FILE__, __LINE__, message " (%"PRIuS" bytes)\n", \ |
- static_cast<size_t>(num_bytes)) |
-#else |
-#define MESSAGE(message, num_bytes) |
-#endif |
+class Logger; |
-// Dumps the specified message and then calls abort(). If |
-// "dump_stats" is specified, the first call will also dump the |
-// tcmalloc stats. |
-extern void TCMalloc_CRASH(bool dump_stats, |
- const char* filename, |
- int line_number, |
- const char* format, ...) |
-#ifdef HAVE___ATTRIBUTE__ |
- __attribute__ ((__format__ (__printf__, 4, 5))) |
-#endif |
-; |
- |
-// This is a class that makes using the macro easier. With this class, |
-// CRASH("%d", i) expands to TCMalloc_CrashReporter.PrintfAndDie("%d", i). |
-class PERFTOOLS_DLL_DECL TCMalloc_CrashReporter { |
+// A LogItem holds any of the argument types that can be passed to Log() |
+class LogItem { |
public: |
- TCMalloc_CrashReporter(bool dump_stats, const char* file, int line) |
- : dump_stats_(dump_stats), file_(file), line_(line) { |
- } |
- void PrintfAndDie(const char* format, ...) |
-#ifdef HAVE___ATTRIBUTE__ |
- __attribute__ ((__format__ (__printf__, 2, 3))) // 2,3 due to "this" |
-#endif |
-; |
- |
+ LogItem() : tag_(kEnd) { } |
+ LogItem(const char* v) : tag_(kStr) { u_.str = v; } |
+ LogItem(int v) : tag_(kSigned) { u_.snum = v; } |
+ LogItem(long v) : tag_(kSigned) { u_.snum = v; } |
+ LogItem(long long v) : tag_(kSigned) { u_.snum = v; } |
+ LogItem(unsigned int v) : tag_(kUnsigned) { u_.unum = v; } |
+ LogItem(unsigned long v) : tag_(kUnsigned) { u_.unum = v; } |
+ LogItem(unsigned long long v) : tag_(kUnsigned) { u_.unum = v; } |
+ LogItem(const void* v) : tag_(kPtr) { u_.ptr = v; } |
private: |
- bool dump_stats_; |
- const char* file_; |
- int line_; |
+ friend class Logger; |
+ enum Tag { |
+ kStr, |
+ kSigned, |
+ kUnsigned, |
+ kPtr, |
+ kEnd |
+ }; |
+ Tag tag_; |
+ union { |
+ const char* str; |
+ const void* ptr; |
+ int64_t snum; |
+ uint64_t unum; |
+ } u_; |
}; |
-#define CRASH \ |
- TCMalloc_CrashReporter(false, __FILE__, __LINE__).PrintfAndDie |
+extern PERFTOOLS_DLL_DECL void Log(LogMode mode, const char* filename, int line, |
+ LogItem a, LogItem b = LogItem(), |
+ LogItem c = LogItem(), LogItem d = LogItem()); |
+ |
+// Tests can override this function to collect logging messages. |
+extern PERFTOOLS_DLL_DECL void (*log_message_writer)(const char* msg, int length); |
-#define CRASH_WITH_STATS \ |
- TCMalloc_CrashReporter(true, __FILE__, __LINE__).PrintfAndDie |
+} // end tcmalloc namespace |
// Like assert(), but executed even in NDEBUG mode |
#undef CHECK_CONDITION |
#define CHECK_CONDITION(cond) \ |
do { \ |
if (!(cond)) { \ |
- CRASH("assertion failed: %s\n", #cond); \ |
+ ::tcmalloc::Log(::tcmalloc::kCrash, __FILE__, __LINE__, #cond); \ |
} \ |
} while (0) |