blob: 7e8e5a6725843c097b905caa186b65f3ff56c1d1 [file] [log] [blame]
diff --git a/configure.ac b/configure.ac
index 69711b7..9b77c07 100644
--- a/configure.ac
+++ b/configure.ac
@@ -127,27 +127,9 @@ if test x"$acx_pthread_ok" = x"yes"; then
AC_CHECK_LIB(pthread, pthread_self)
fi
-# Check if there is google-gflags library installed.
-SAVE_CFLAGS="$CFLAGS"
-SAVE_LIBS="$LIBS"
-AC_ARG_WITH(gflags, AS_HELP_STRING[--with-gflags=GFLAGS_DIR],
- GFLAGS_CFLAGS="-I${with_gflags}/include"
- GFLAGS_LIBS="-L${with_gflags}/lib -lgflags"
- CFLAGS="$CFLAGS $GFLAGS_CFLAGS"
- LIBS="$LIBS $GFLAGS_LIBS"
-)
-AC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=1, ac_cv_have_libgflags=0)
-if test x"$ac_cv_have_libgflags" = x"1"; then
- AC_DEFINE(HAVE_LIB_GFLAGS, 1, [define if you have google gflags library])
- if test x"$GFLAGS_LIBS" = x""; then
- GFLAGS_LIBS="-lgflags"
- fi
-else
- GFLAGS_CFLAGS=
- GFLAGS_LIBS=
-fi
-CFLAGS="$SAVE_CFLAGS"
-LIBS="$SAVE_LIBS"
+GFLAGS_CFLAGS=
+GFLAGS_LIBS=
+ac_cv_have_libgflags=0
# TODO(hamaji): Use official m4 macros provided by testing libraries
# once the m4 macro of Google Mocking becomes ready.
diff --git a/src/glog/stl_logging.h.in b/src/glog/stl_logging.h.in
index 600945d..bd935d5 100644
--- a/src/glog/stl_logging.h.in
+++ b/src/glog/stl_logging.h.in
@@ -59,6 +59,13 @@
#include <utility>
#include <vector>
+#if defined (__GNUC__) && !defined(_LIBCPP_VERSION)
+# define GLOG_STL_LOGGING_FOR_EXT_HASH
+# define GLOG_STL_LOGGING_FOR_EXT_SLIST
+#elif defined(_LIBCPP_VERSION)
+# define GLOG_STL_LOGGING_FOR_UNORDERED
+#endif
+
#ifdef GLOG_STL_LOGGING_FOR_UNORDERED
# include <unordered_map>
# include <unordered_set>
diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in
index 9968b96..ee0dc82 100644
--- a/src/glog/logging.h.in
+++ b/src/glog/logging.h.in
@@ -1423,6 +1423,16 @@ class GOOGLE_GLOG_DLL_DECL LogSink {
// Sink's logging logic (message_len is such as to exclude '\n' at the end).
// This method can't use LOG() or CHECK() as logging system mutex(s) are held
// during this call.
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
+ const struct ::tm* tm_time,
+ const char* message, size_t message_len, int32 usecs) {
+ send(severity, full_filename, base_filename, line,
+ tm_time, message, message_len);
+ }
+ // This send() signature is obsolete.
+ // New implementations should define this in terms of
+ // the above send() method.
virtual void send(LogSeverity severity, const char* full_filename,
const char* base_filename, int line,
const struct ::tm* tm_time,
@@ -1447,7 +1457,15 @@ class GOOGLE_GLOG_DLL_DECL LogSink {
// Can be useful to implement send().
static std::string ToString(LogSeverity severity, const char* file, int line,
const struct ::tm* tm_time,
- const char* message, size_t message_len);
+ const char* message, size_t message_len,
+ int32 usecs);
+
+ // Obsolete
+ static std::string ToString(LogSeverity severity, const char* file, int line,
+ const struct ::tm* tm_time,
+ const char* message, size_t message_len) {
+ return ToString(severity, file, line, tm_time, message, message_len, 0);
+ }
};
// Add or remove a LogSink as a consumer of logging data. Thread-safe.
diff --git a/src/logging.cc b/src/logging.cc
index 0c86cf6..2da00eb 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -349,6 +349,7 @@ struct LogMessage::LogMessageData {
};
time_t timestamp_; // Time of creation of LogMessage
struct ::tm tm_time_; // Time of creation of LogMessage
+ int32 usecs_; // Time of creation of LogMessage - microseconds part
size_t num_prefix_chars_; // # of chars of prefix in this message
size_t num_chars_to_log_; // # of chars of msg to send to log
size_t num_chars_to_syslog_; // # of chars of msg to send to syslog
@@ -515,7 +516,8 @@ class LogDestination {
int line,
const struct ::tm* tm_time,
const char* message,
- size_t message_len);
+ size_t message_len,
+ int32 usecs);
// Wait for all registered sinks via WaitTillSent
// including the optional one in "data".
@@ -782,12 +784,13 @@ inline void LogDestination::LogToSinks(LogSeverity severity,
int line,
const struct ::tm* tm_time,
const char* message,
- size_t message_len) {
+ size_t message_len,
+ int32 usecs) {
ReaderMutexLock l(&sink_mutex_);
if (sinks_) {
for (int i = sinks_->size() - 1; i >= 0; i--) {
(*sinks_)[i]->send(severity, full_filename, base_filename,
- line, tm_time, message, message_len);
+ line, tm_time, message, message_len, usecs);
}
}
}
@@ -1265,7 +1268,7 @@ void LogMessage::Init(const char* file,
WallTime now = WallTime_Now();
data_->timestamp_ = static_cast<time_t>(now);
localtime_r(&data_->timestamp_, &data_->tm_time_);
- int usecs = static_cast<int>((now - data_->timestamp_) * 1000000);
+ data_->usecs_ = static_cast<int32>((now - data_->timestamp_) * 1000000);
data_->num_chars_to_log_ = 0;
data_->num_chars_to_syslog_ = 0;
@@ -1285,7 +1288,7 @@ void LogMessage::Init(const char* file,
<< setw(2) << data_->tm_time_.tm_hour << ':'
<< setw(2) << data_->tm_time_.tm_min << ':'
<< setw(2) << data_->tm_time_.tm_sec << "."
- << setw(6) << usecs
+ << setw(6) << data_->usecs_
<< ' '
<< setfill(' ') << setw(5)
<< static_cast<unsigned int>(GetTID()) << setfill('0')
@@ -1432,7 +1435,8 @@ void LogMessage::SendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
data_->line_, &data_->tm_time_,
data_->message_text_ + data_->num_prefix_chars_,
(data_->num_chars_to_log_ -
- data_->num_prefix_chars_ - 1));
+ data_->num_prefix_chars_ - 1),
+ data_->usecs_);
} else {
// log this message to all log files of severity <= severity_
@@ -1449,7 +1453,8 @@ void LogMessage::SendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
data_->line_, &data_->tm_time_,
data_->message_text_ + data_->num_prefix_chars_,
(data_->num_chars_to_log_
- - data_->num_prefix_chars_ - 1));
+ - data_->num_prefix_chars_ - 1),
+ data_->usecs_);
// NOTE: -1 removes trailing \n
}
@@ -1545,7 +1550,8 @@ void LogMessage::SendToSink() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
data_->line_, &data_->tm_time_,
data_->message_text_ + data_->num_prefix_chars_,
(data_->num_chars_to_log_ -
- data_->num_prefix_chars_ - 1));
+ data_->num_prefix_chars_ - 1),
+ data_->usecs_);
}
}
@@ -1672,16 +1678,10 @@ void LogSink::WaitTillSent() {
string LogSink::ToString(LogSeverity severity, const char* file, int line,
const struct ::tm* tm_time,
- const char* message, size_t message_len) {
+ const char* message, size_t message_len, int32 usecs) {
ostringstream stream(string(message, message_len));
stream.fill('0');
- // FIXME(jrvb): Updating this to use the correct value for usecs
- // requires changing the signature for both this method and
- // LogSink::send(). This change needs to be done in a separate CL
- // so subclasses of LogSink can be updated at the same time.
- int usecs = 0;
-
stream << LogSeverityNames[severity][0]
<< setw(2) << 1+tm_time->tm_mon
<< setw(2) << tm_time->tm_mday
diff --git a/src/logging_unittest.cc b/src/logging_unittest.cc
index 762c752..7f9de36 100644
--- a/src/logging_unittest.cc
+++ b/src/logging_unittest.cc
@@ -487,9 +487,16 @@ class TestLogSinkImpl : public LogSink {
virtual void send(LogSeverity severity, const char* /* full_filename */,
const char* base_filename, int line,
const struct tm* tm_time,
- const char* message, size_t message_len) {
+ const char* message, size_t message_len, int usecs) {
errors.push_back(
- ToString(severity, base_filename, line, tm_time, message, message_len));
+ ToString(severity, base_filename, line, tm_time, message, message_len, usecs));
+ }
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
+ const struct tm* tm_time,
+ const char* message, size_t message_len) {
+ send(severity, full_filename, base_filename, line,
+ tm_time, message, message_len, 0);
}
};
@@ -1010,15 +1017,23 @@ class TestWaitingLogSink : public LogSink {
virtual void send(LogSeverity severity, const char* /* full_filename */,
const char* base_filename, int line,
const struct tm* tm_time,
- const char* message, size_t message_len) {
+ const char* message, size_t message_len, int usecs) {
// Push it to Writer thread if we are the original logging thread.
// Note: Something like ThreadLocalLogSink is a better choice
// to do thread-specific LogSink logic for real.
if (pthread_equal(tid_, pthread_self())) {
writer_.Buffer(ToString(severity, base_filename, line,
- tm_time, message, message_len));
+ tm_time, message, message_len, usecs));
}
}
+
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
+ const struct tm* tm_time,
+ const char* message, size_t message_len) {
+ send(severity, full_filename, base_filename, line, tm_time, message, message_len);
+ }
+
virtual void WaitTillSent() {
// Wait for Writer thread if we are the original logging thread.
if (pthread_equal(tid_, pthread_self())) writer_.Wait();
diff --git a/src/windows/glog/logging.h b/src/windows/glog/logging.h
index 3681fa3..d8193ae 100755
--- a/src/windows/glog/logging.h
+++ b/src/windows/glog/logging.h
@@ -1427,6 +1427,16 @@ class GOOGLE_GLOG_DLL_DECL LogSink {
// Sink's logging logic (message_len is such as to exclude '\n' at the end).
// This method can't use LOG() or CHECK() as logging system mutex(s) are held
// during this call.
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
+ const struct ::tm* tm_time,
+ const char* message, size_t message_len, int32 usecs) {
+ send(severity, full_filename, base_filename, line,
+ tm_time, message, message_len);
+ }
+ // This send() signature is obsolete.
+ // New implementations should define this in terms of
+ // the above send() method.
virtual void send(LogSeverity severity, const char* full_filename,
const char* base_filename, int line,
const struct ::tm* tm_time,
@@ -1451,7 +1461,15 @@ class GOOGLE_GLOG_DLL_DECL LogSink {
// Can be useful to implement send().
static std::string ToString(LogSeverity severity, const char* file, int line,
const struct ::tm* tm_time,
- const char* message, size_t message_len);
+ const char* message, size_t message_len,
+ int32 usecs);
+
+ // Obsolete
+ static std::string ToString(LogSeverity severity, const char* file, int line,
+ const struct ::tm* tm_time,
+ const char* message, size_t message_len) {
+ return ToString(severity, file, line, tm_time, message, message_len, 0);
+ }
};
// Add or remove a LogSink as a consumer of logging data. Thread-safe.