leveldb
Public Member Functions | Private Attributes | List of all members
leveldb::PosixLogger Class Reference

#include <posix_logger.h>

Inheritance diagram for leveldb::PosixLogger:
Inheritance graph
[legend]
Collaboration diagram for leveldb::PosixLogger:
Collaboration graph
[legend]

Public Member Functions

 PosixLogger (FILE *f, uint64_t(*gettid)())
 
virtual ~PosixLogger ()
 
virtual void Logv (const char *format, va_list ap)
 
- Public Member Functions inherited from leveldb::Logger
 Logger ()
 
virtual ~Logger ()
 

Private Attributes

FILE * file_
 
uint64_t(* gettid_ )()
 

Detailed Description

Definition at line 19 of file posix_logger.h.

Constructor & Destructor Documentation

§ PosixLogger()

leveldb::PosixLogger::PosixLogger ( FILE *  f,
uint64_t(*)()  gettid 
)
inline

Definition at line 24 of file posix_logger.h.

24 : file_(f), gettid_(gettid) { }
uint64_t(* gettid_)()
Definition: posix_logger.h:22

§ ~PosixLogger()

virtual leveldb::PosixLogger::~PosixLogger ( )
inlinevirtual

Definition at line 25 of file posix_logger.h.

25  {
26  fclose(file_);
27  }

Member Function Documentation

§ Logv()

virtual void leveldb::PosixLogger::Logv ( const char *  format,
va_list  ap 
)
inlinevirtual

Implements leveldb::Logger.

Definition at line 28 of file posix_logger.h.

28  {
29  const uint64_t thread_id = (*gettid_)();
30 
31  // We try twice: the first time with a fixed-size stack allocated buffer,
32  // and the second time with a much larger dynamically allocated buffer.
33  char buffer[500];
34  for (int iter = 0; iter < 2; iter++) {
35  char* base;
36  int bufsize;
37  if (iter == 0) {
38  bufsize = sizeof(buffer);
39  base = buffer;
40  } else {
41  bufsize = 30000;
42  base = new char[bufsize];
43  }
44  char* p = base;
45  char* limit = base + bufsize;
46 
47  struct timeval now_tv;
48  gettimeofday(&now_tv, NULL);
49  const time_t seconds = now_tv.tv_sec;
50  struct tm t;
51  localtime_r(&seconds, &t);
52  p += snprintf(p, limit - p,
53  "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ",
54  t.tm_year + 1900,
55  t.tm_mon + 1,
56  t.tm_mday,
57  t.tm_hour,
58  t.tm_min,
59  t.tm_sec,
60  static_cast<int>(now_tv.tv_usec),
61  static_cast<long long unsigned int>(thread_id));
62 
63  // Print the message
64  if (p < limit) {
65  va_list backup_ap;
66  va_copy(backup_ap, ap);
67  p += vsnprintf(p, limit - p, format, backup_ap);
68  va_end(backup_ap);
69  }
70 
71  // Truncate to available space if necessary
72  if (p >= limit) {
73  if (iter == 0) {
74  continue; // Try again with larger buffer
75  } else {
76  p = limit - 1;
77  }
78  }
79 
80  // Add newline if necessary
81  if (p == base || p[-1] != '\n') {
82  *p++ = '\n';
83  }
84 
85  assert(p <= limit);
86  fwrite(base, 1, p - base, file_);
87  fflush(file_);
88  if (base != buffer) {
89  delete[] base;
90  }
91  break;
92  }
93  }

Member Data Documentation

§ file_

FILE* leveldb::PosixLogger::file_
private

Definition at line 21 of file posix_logger.h.

§ gettid_

uint64_t(* leveldb::PosixLogger::gettid_) ()
private

Definition at line 22 of file posix_logger.h.


The documentation for this class was generated from the following file: