123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #ifndef THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_
- #define THIRD_PARTY_LEVELDATABASE_CHROMIUM_LOGGER_H_
- #include <cstdarg>
- #include <utility>
- #include "base/files/file.h"
- #include "base/format_macros.h"
- #include "base/strings/string_util.h"
- #include "base/threading/platform_thread.h"
- #include "base/time/time.h"
- namespace leveldb {
- class ChromiumLogger : public Logger {
- public:
- explicit ChromiumLogger(base::File file) : file_(std::move(file)) {}
- ~ChromiumLogger() override = default;
- void Logv(const char* format, va_list arguments) override {
-
- base::Time::Exploded now_exploded;
- base::Time::Now().LocalExplode(&now_exploded);
- const base::PlatformThreadId thread_id = base::PlatformThread::CurrentId();
-
-
- constexpr const int kStackBufferSize = 512;
- char stack_buffer[kStackBufferSize];
- static_assert(sizeof(stack_buffer) == static_cast<size_t>(kStackBufferSize),
- "sizeof(char) is expected to be 1 in C++");
- int dynamic_buffer_size = 0;
- for (int iteration = 0; iteration < 2; ++iteration) {
- const int buffer_size =
- (iteration == 0) ? kStackBufferSize : dynamic_buffer_size;
- char* const buffer =
- (iteration == 0) ? stack_buffer : new char[dynamic_buffer_size];
-
- int buffer_offset = base::snprintf(
- buffer, buffer_size,
- "%04d/%02d/%02d-%02d:%02d:%02d.%03d %" PRIx64 " ",
- now_exploded.year,
- now_exploded.month,
- now_exploded.day_of_month,
- now_exploded.hour,
- now_exploded.minute,
- now_exploded.second,
- now_exploded.millisecond,
- static_cast<uint64_t>(thread_id));
-
-
- DCHECK_LE(buffer_offset, 45);
- static_assert(45 < kStackBufferSize,
- "stack-allocated buffer may not fit the message header");
- DCHECK_LT(buffer_offset, buffer_size);
-
- std::va_list arguments_copy;
- va_copy(arguments_copy, arguments);
- buffer_offset += std::vsnprintf(buffer + buffer_offset,
- buffer_size - buffer_offset, format,
- arguments_copy);
- va_end(arguments_copy);
-
-
- if (buffer_offset >= buffer_size - 1) {
-
- if (iteration == 0) {
-
-
-
- dynamic_buffer_size = buffer_offset + 2;
- continue;
- }
-
-
-
- NOTREACHED();
- buffer_offset = buffer_size - 1;
- }
-
- if (buffer[buffer_offset - 1] != '\n') {
- buffer[buffer_offset] = '\n';
- ++buffer_offset;
- }
- DCHECK_LE(buffer_offset, buffer_size);
- file_.WriteAtCurrentPos(buffer, buffer_offset);
- if (iteration != 0) {
- delete[] buffer;
- }
- break;
- }
- }
- private:
- base::File file_;
- };
- }
- #endif
|