diff options
-rw-r--r-- | lldb/include/lldb/Utility/Log.h | 5 | ||||
-rw-r--r-- | lldb/include/lldb/Utility/Logging.h | 2 | ||||
-rw-r--r-- | lldb/source/Host/posix/ProcessLauncherPosixFork.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Initialization/SystemInitializerCommon.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Utility/Log.cpp | 16 | ||||
-rw-r--r-- | lldb/source/Utility/Logging.cpp | 2 |
6 files changed, 24 insertions, 7 deletions
diff --git a/lldb/include/lldb/Utility/Log.h b/lldb/include/lldb/Utility/Log.h index d856fc81eb0..80a80fc1648 100644 --- a/lldb/include/lldb/Utility/Log.h +++ b/lldb/include/lldb/Utility/Log.h @@ -96,6 +96,9 @@ public: } }; + + static void Initialize(); + //------------------------------------------------------------------ // Static accessors for logging channels //------------------------------------------------------------------ @@ -193,6 +196,8 @@ private: static uint32_t GetFlags(llvm::raw_ostream &stream, const ChannelMap::value_type &entry, llvm::ArrayRef<const char *> categories); + static void DisableLoggingChild(); + Log(const Log &) = delete; void operator=(const Log &) = delete; }; diff --git a/lldb/include/lldb/Utility/Logging.h b/lldb/include/lldb/Utility/Logging.h index 865097e7c19..2c75a3bf218 100644 --- a/lldb/include/lldb/Utility/Logging.h +++ b/lldb/include/lldb/Utility/Logging.h @@ -62,7 +62,7 @@ Log *GetLogIfAllCategoriesSet(uint32_t mask); Log *GetLogIfAnyCategoriesSet(uint32_t mask); -void InitializeLog(); +void InitializeLldbChannel(); } // namespace lldb_private diff --git a/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp b/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp index fb235d70f8e..ac1d9011c2b 100644 --- a/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp +++ b/lldb/source/Host/posix/ProcessLauncherPosixFork.cpp @@ -95,10 +95,6 @@ static void DupDescriptor(int error_fd, const FileSpec &file_spec, int fd, static void LLVM_ATTRIBUTE_NORETURN ChildFunc(int error_fd, const ProcessLaunchInfo &info) { - // First, make sure we disable all logging. If we are logging to stdout, our - // logs can be mistaken for inferior output. - Log::DisableAllLogChannels(); - // Do not inherit setgid powers. if (setgid(getgid()) != 0) ExitWithError(error_fd, "setgid"); diff --git a/lldb/source/Initialization/SystemInitializerCommon.cpp b/lldb/source/Initialization/SystemInitializerCommon.cpp index e76ba4122bb..853547051ff 100644 --- a/lldb/source/Initialization/SystemInitializerCommon.cpp +++ b/lldb/source/Initialization/SystemInitializerCommon.cpp @@ -70,7 +70,7 @@ void SystemInitializerCommon::Initialize() { #endif llvm::EnablePrettyStackTrace(); - InitializeLog(); + Log::Initialize(); HostInfo::Initialize(); static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); diff --git a/lldb/source/Utility/Log.cpp b/lldb/source/Utility/Log.cpp index a80b106838b..78050dbea68 100644 --- a/lldb/source/Utility/Log.cpp +++ b/lldb/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 @@ void Log::Warning(const char *format, ...) { Printf("warning: %s", Content.c_str()); } +void Log::Initialize() { +#ifdef LLVM_ON_UNIX + pthread_atfork(nullptr, nullptr, &Log::DisableLoggingChild); +#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,11 @@ void Log::Format(llvm::StringRef file, llvm::StringRef function, message << payload << "\n"; WriteMessage(message.str()); } + +void Log::DisableLoggingChild() { + // Disable logging by clearing out the atomic variable after forking -- if we + // forked while another thread held the channel mutex, we would deadlock when + // trying to write to the log. + for (auto &c: *g_channel_map) + c.second.m_channel.log_ptr.store(nullptr, std::memory_order_relaxed); +} diff --git a/lldb/source/Utility/Logging.cpp b/lldb/source/Utility/Logging.cpp index 0bd6d6692e3..c9a6ef1bd1e 100644 --- a/lldb/source/Utility/Logging.cpp +++ b/lldb/source/Utility/Logging.cpp @@ -51,7 +51,7 @@ static constexpr Log::Category g_categories[] = { 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); } |