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);
 };