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