Index: third_party/leveldatabase/chromium_logger.h |
diff --git a/third_party/leveldatabase/chromium_logger.h b/third_party/leveldatabase/chromium_logger.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ccb518bab3ead1cfa977313400ed05712824706a |
--- /dev/null |
+++ b/third_party/leveldatabase/chromium_logger.h |
@@ -0,0 +1,93 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_ |
+#define THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_ |
+ |
+#include <algorithm> |
+#include <stdio.h> |
+#include "base/string_util.h" |
+#include "base/time.h" |
+#include "leveldb/env.h" |
+ |
+namespace leveldb { |
+ |
+class ChromiumLogger : public Logger { |
+ public: |
+ ChromiumLogger(FILE* f) : file_(f) { } |
+ virtual ~ChromiumLogger() { |
+ fclose(file_); |
+ } |
+ virtual void Logv(const char* format, va_list ap) { |
+ const long long unsigned int thread_id = |
+ ::base::PlatformThread::CurrentId(); |
+ |
+ // We try twice: the first time with a fixed-size stack allocated buffer, |
+ // and the second time with a much larger dynamically allocated buffer. |
+ char buffer[500]; |
+ for (int iter = 0; iter < 2; iter++) { |
+ char* base; |
+ int bufsize; |
+ if (iter == 0) { |
+ bufsize = sizeof(buffer); |
+ base = buffer; |
+ } else { |
+ bufsize = 30000; |
+ base = new char[bufsize]; |
+ } |
+ char* p = base; |
+ char* limit = base + bufsize; |
+ |
+ ::base::Time::Exploded t; |
+ ::base::Time::Now().LocalExplode(&t); |
+ |
+ p += ::base::snprintf(p, limit - p, |
+ "%04d/%02d/%02d-%02d:%02d:%02d.%03d %lld ", |
+ t.year, |
+ t.month, |
+ t.day_of_month, |
+ t.hour, |
+ t.minute, |
+ t.second, |
+ t.millisecond, |
+ thread_id); |
+ |
+ // Print the message |
+ if (p < limit) { |
+ va_list backup_ap; |
+ GG_VA_COPY(backup_ap, ap); |
+ p += vsnprintf(p, limit - p, format, backup_ap); |
+ va_end(backup_ap); |
+ } |
+ |
+ // Truncate to available space if necessary |
+ if (p >= limit) { |
+ if (iter == 0) { |
+ continue; // Try again with larger buffer |
+ } else { |
+ p = limit - 1; |
+ } |
+ } |
+ |
+ // Add newline if necessary |
+ if (p == base || p[-1] != '\n') { |
+ *p++ = '\n'; |
+ } |
+ |
+ assert(p <= limit); |
+ fwrite(base, 1, p - base, file_); |
+ fflush(file_); |
+ if (base != buffer) { |
+ delete[] base; |
+ } |
+ break; |
+ } |
+ } |
+ private: |
+ FILE* file_; |
+}; |
+ |
+} // namespace leveldb |
+ |
+#endif // THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_ |