diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/logging.h | 11 | ||||
| -rw-r--r-- | src/base/mutex.cc | 10 |
2 files changed, 15 insertions, 6 deletions
diff --git a/src/base/logging.h b/src/base/logging.h index 310357d11b..f250ce01b3 100644 --- a/src/base/logging.h +++ b/src/base/logging.h @@ -170,10 +170,10 @@ struct LogMessageData { public: LogMessageData(const char* file, int line, LogSeverity severity, int error); std::ostringstream buffer; - const char* file; - int line_number; - LogSeverity severity; - int error; + const char* const file; + const int line_number; + const LogSeverity severity; + const int error; private: DISALLOW_COPY_AND_ASSIGN(LogMessageData); @@ -190,9 +190,10 @@ class LogMessage { private: static void LogLine(const LogMessageData& data, const char*); - LogMessageData* data_; + LogMessageData* const data_; friend void HandleUnexpectedSignal(int signal_number, siginfo_t* info, void* raw_context); + friend class Mutex; DISALLOW_COPY_AND_ASSIGN(LogMessage); }; diff --git a/src/base/mutex.cc b/src/base/mutex.cc index 86356a9b85..a2851e5b3c 100644 --- a/src/base/mutex.cc +++ b/src/base/mutex.cc @@ -394,7 +394,15 @@ void Mutex::ExclusiveUnlock(Thread* self) { } } } else { - LOG(FATAL) << "Unexpected state_:" << cur_state << " for " << name_; + // Logging acquires the logging lock, avoid infinite recursion in that case. + if (this != Locks::logging_lock_) { + LOG(FATAL) << "Unexpected state_ in unlock " << cur_state << " for " << name_; + } else { + LogMessageData data(__FILE__, __LINE__, INTERNAL_FATAL, -1); + LogMessage::LogLine(data, StringPrintf("Unexpected state_ %d in unlock for %s", + cur_state, name_).c_str()); + _exit(1); + } } } while(!done); #else |