summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/glog/logging.h.in6
-rw-r--r--src/logging.cc22
-rw-r--r--src/logging_unittest.cc7
-rw-r--r--src/logging_unittest.err4
4 files changed, 18 insertions, 21 deletions
diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in
index 35c65be..099e33d 100644
--- a/src/glog/logging.h.in
+++ b/src/glog/logging.h.in
@@ -1114,11 +1114,6 @@ class GOOGLE_GLOG_DLL_DECL LogStreamBuf : public std::streambuf {
setp(buf, buf + len - 2);
}
- // Resets the buffer. Useful if we reuse it by means of TLS.
- void reset() {
- setp(pbase(), epptr());
- }
-
// This effectively ignores overflow.
virtual int_type overflow(int_type ch) {
return ch;
@@ -1181,7 +1176,6 @@ public:
size_t pcount() const { return streambuf_.pcount(); }
char* pbase() const { return streambuf_.pbase(); }
char* str() const { return pbase(); }
- void reset() { streambuf_.reset(); }
private:
LogStream(const LogStream&);
diff --git a/src/logging.cc b/src/logging.cc
index 0d9aad8..d9b9180 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -331,7 +331,6 @@ const size_t LogMessage::kMaxLogMessageLen = 30000;
struct LogMessage::LogMessageData {
LogMessageData();
- void reset();
int preserved_errno_; // preserved errno
// Buffer space; contains complete message text.
@@ -1151,17 +1150,13 @@ static LogMessage::LogMessageData fatal_msg_data_shared;
// LogMessageData object exists (in this case glog makes zero heap memory
// allocations).
static GLOG_THREAD_LOCAL_STORAGE bool thread_data_available = true;
-static GLOG_THREAD_LOCAL_STORAGE LogMessage::LogMessageData thread_msg_data;
+static GLOG_THREAD_LOCAL_STORAGE char thread_msg_data[sizeof(LogMessage::LogMessageData)];
#endif // defined(GLOG_THREAD_LOCAL_STORAGE)
LogMessage::LogMessageData::LogMessageData()
: stream_(message_text_, LogMessage::kMaxLogMessageLen, 0) {
}
-void LogMessage::LogMessageData::reset() {
- stream_.reset();
-}
-
LogMessage::LogMessage(const char* file, int line, LogSeverity severity,
int ctr, void (LogMessage::*send_method)())
: allocated_(NULL) {
@@ -1218,10 +1213,7 @@ void LogMessage::Init(const char* file,
// No need for locking, because this is thread local.
if (thread_data_available) {
thread_data_available = false;
- data_ = &thread_msg_data;
- // Make sure to clear log data since it may have been used and filled with
- // data. We do not want to append the new message to the previous one.
- data_->reset();
+ data_ = new (&thread_msg_data) LogMessageData;
} else {
allocated_ = new LogMessageData();
data_ = allocated_;
@@ -1299,10 +1291,16 @@ void LogMessage::Init(const char* file,
LogMessage::~LogMessage() {
Flush();
#ifdef GLOG_THREAD_LOCAL_STORAGE
- if (data_ == &thread_msg_data)
+ if (data_ == static_cast<void*>(thread_msg_data)) {
+ data_->~LogMessageData();
thread_data_available = true;
-#endif // defined(GLOG_THREAD_LOCAL_STORAGE)
+ }
+ else {
+ delete allocated_;
+ }
+#else // !defined(GLOG_THREAD_LOCAL_STORAGE)
delete allocated_;
+#endif // defined(GLOG_THREAD_LOCAL_STORAGE)
}
int LogMessage::preserved_errno() const {
diff --git a/src/logging_unittest.cc b/src/logging_unittest.cc
index 600cd06..b8a9a87 100644
--- a/src/logging_unittest.cc
+++ b/src/logging_unittest.cc
@@ -272,7 +272,12 @@ void TestLogging(bool check_counts) {
LOG(ERROR) << string("foo") << ' '<< j << ' ' << setw(10) << j << " "
<< setw(1) << hex << j;
- LOG(ERROR) << (&LOG(ERROR) && 0) << " nested LOG";
+ {
+ google::LogMessage outer(__FILE__, __LINE__, google::ERROR);
+ outer.stream() << "outer";
+
+ LOG(ERROR) << "inner";
+ }
LogMessage("foo", LogMessage::kNoLogPrefix, GLOG_INFO).stream() << "no prefix";
diff --git a/src/logging_unittest.err b/src/logging_unittest.err
index e08836f..e178cc4 100644
--- a/src/logging_unittest.err
+++ b/src/logging_unittest.err
@@ -74,8 +74,8 @@ WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if this
IDATE TIME__ THREADID logging_unittest.cc:LINE] array
IDATE TIME__ THREADID logging_unittest.cc:LINE] const array
EDATE TIME__ THREADID logging_unittest.cc:LINE] foo 1000 0000001000 3e8
-EDATE TIME__ THREADID logging_unittest.cc:LINE] 0 nested LOG
-EDATE TIME__ THREADID logging_unittest.cc:LINE]
+EDATE TIME__ THREADID logging_unittest.cc:LINE] inner
+EDATE TIME__ THREADID logging_unittest.cc:LINE] outer
no prefix
IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo bar 10 3.400000
WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: array