labath updated this revision to Diff 119315.
labath added a comment.

Solve the problem using pthread_atfork().

This way the locks are properly taken before forking and released in both child
and parent processes. This behavior is encapsulated within the Log class and is
completely transparent to all fork users (but it requires a tiny bit of
system-specific code).


https://reviews.llvm.org/D38938

Files:
  include/lldb/Utility/Log.h
  include/lldb/Utility/Logging.h
  source/Initialization/SystemInitializerCommon.cpp
  source/Utility/Log.cpp
  source/Utility/Logging.cpp

Index: source/Utility/Logging.cpp
===================================================================
--- source/Utility/Logging.cpp
+++ source/Utility/Logging.cpp
@@ -51,7 +51,7 @@
 
 static Log::Channel g_log_channel(g_categories, LIBLLDB_LOG_DEFAULT);
 
-void lldb_private::InitializeLog() {
+void lldb_private::InitializeLldbChannel() {
   Log::Register("lldb", g_log_channel);
 }
 
Index: source/Utility/Log.cpp
===================================================================
--- source/Utility/Log.cpp
+++ source/Utility/Log.cpp
@@ -32,6 +32,7 @@
 #include <process.h> // for getpid
 #else
 #include <unistd.h>
+#include <pthread.h>
 #endif
 
 using namespace lldb_private;
@@ -181,6 +182,13 @@
   Printf("warning: %s", Content.c_str());
 }
 
+void Log::Initialize() {
+#ifdef LLVM_ON_UNIX
+  pthread_atfork(&Log::LockAllChannels, &Log::UnlockAllChannels, &Log::UnlockAllChannels);
+#endif
+  InitializeLldbChannel();
+}
+
 void Log::Register(llvm::StringRef name, Channel &channel) {
   auto iter = g_channel_map->try_emplace(name, channel);
   assert(iter.second == true);
@@ -321,3 +329,13 @@
   message << payload << "\n";
   WriteMessage(message.str());
 }
+
+void Log::LockAllChannels() {
+  for (auto &c: *g_channel_map)
+    c.second.m_mutex.lock();
+}
+
+void Log::UnlockAllChannels() {
+  for (auto &c: *g_channel_map)
+    c.second.m_mutex.unlock();
+}
Index: source/Initialization/SystemInitializerCommon.cpp
===================================================================
--- source/Initialization/SystemInitializerCommon.cpp
+++ source/Initialization/SystemInitializerCommon.cpp
@@ -70,7 +70,7 @@
 #endif
 
   llvm::EnablePrettyStackTrace();
-  InitializeLog();
+  Log::Initialize();
   HostInfo::Initialize();
   static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
   Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
Index: include/lldb/Utility/Logging.h
===================================================================
--- include/lldb/Utility/Logging.h
+++ include/lldb/Utility/Logging.h
@@ -62,7 +62,7 @@
 
 Log *GetLogIfAnyCategoriesSet(uint32_t mask);
 
-void InitializeLog();
+void InitializeLldbChannel();
 
 } // namespace lldb_private
 
Index: include/lldb/Utility/Log.h
===================================================================
--- include/lldb/Utility/Log.h
+++ include/lldb/Utility/Log.h
@@ -96,6 +96,9 @@
     }
   };
 
+
+  static void Initialize();
+
   //------------------------------------------------------------------
   // Static accessors for logging channels
   //------------------------------------------------------------------
@@ -193,6 +196,9 @@
   static uint32_t GetFlags(llvm::raw_ostream &stream, const ChannelMap::value_type &entry,
                            llvm::ArrayRef<const char *> categories);
 
+  static void LockAllChannels();
+  static void UnlockAllChannels();
+
   Log(const Log &) = delete;
   void operator=(const Log &) = delete;
 };
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to