Prevent hang due to HandleUnexpectedSignal reentry
Change-Id: I0fe6a9b642e8d866aba893906c36bca6f1a4334e
diff --git a/src/logging.h b/src/logging.h
index d0d35ea..1c04b2c 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -21,6 +21,7 @@
#include <cstring>
#include <iostream> // NOLINT
#include <sstream>
+#include <signal.h>
#include "log_severity.h"
#include "macros.h"
@@ -167,13 +168,7 @@
// lots of checks/logging in a function.
struct LogMessageData {
public:
- LogMessageData(int line, LogSeverity severity, int error)
- : file(NULL),
- line_number(line),
- severity(severity),
- error(error) {
- }
-
+ LogMessageData(const char* file, int line, LogSeverity severity, int error);
std::ostringstream buffer;
const char* file;
int line_number;
@@ -186,15 +181,18 @@
class LogMessage {
public:
- LogMessage(const char* file, int line, LogSeverity severity, int error);
+ LogMessage(const char* file, int line, LogSeverity severity, int error)
+ : data_(new LogMessageData(file, line, severity, error)) {
+ }
~LogMessage() LOCKS_EXCLUDED(Locks::logging_lock_);
std::ostream& stream();
private:
- void LogLine(const char*);
+ static void LogLine(const LogMessageData& data, const char*);
LogMessageData* data_;
+ friend void HandleUnexpectedSignal(int signal_number, siginfo_t* info, void* raw_context);
DISALLOW_COPY_AND_ASSIGN(LogMessage);
};