Index: lldb/include/lldb/Utility/Log.h =================================================================== --- lldb/include/lldb/Utility/Log.h +++ lldb/include/lldb/Utility/Log.h @@ -33,7 +33,6 @@ class raw_ostream; } // Logging Options -#define LLDB_LOG_OPTION_THREADSAFE (1u << 0) #define LLDB_LOG_OPTION_VERBOSE (1u << 1) #define LLDB_LOG_OPTION_PREPEND_SEQUENCE (1u << 3) #define LLDB_LOG_OPTION_PREPEND_TIMESTAMP (1u << 4) @@ -50,10 +49,6 @@ public: virtual ~LogHandler() = default; virtual void Emit(llvm::StringRef message) = 0; - void EmitThreadSafe(llvm::StringRef message); - -private: - std::mutex m_mutex; }; class StreamLogHandler : public LogHandler { @@ -62,8 +57,10 @@ ~StreamLogHandler() override; void Emit(llvm::StringRef message) override; + void Flush(); private: + std::mutex m_mutex; llvm::raw_fd_ostream m_stream; }; @@ -90,6 +87,7 @@ size_t GetNumMessages() const; size_t GetFirstMessageIndex() const; + mutable std::mutex m_mutex; std::unique_ptr m_messages; const size_t m_size = 0; size_t m_next_index = 0; Index: lldb/source/Commands/CommandObjectLog.cpp =================================================================== --- lldb/source/Commands/CommandObjectLog.cpp +++ lldb/source/Commands/CommandObjectLog.cpp @@ -94,9 +94,6 @@ error = buffer_size.SetValueFromString(option_arg, eVarSetOperationAssign); break; - case 't': - log_options |= LLDB_LOG_OPTION_THREADSAFE; - break; case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; Index: lldb/source/Commands/Options.td =================================================================== --- lldb/source/Commands/Options.td +++ lldb/source/Commands/Options.td @@ -433,8 +433,6 @@ Desc<"Set the destination file to log to.">; def log_buffer_size : Option<"buffer", "b">, Group<1>, Arg<"UnsignedInteger">, Desc<"Set the log to be buffered, using the specified buffer size.">; - def log_threadsafe : Option<"threadsafe", "t">, Group<1>, - Desc<"Enable thread safe logging to avoid interweaved log lines.">; def log_verbose : Option<"verbose", "v">, Group<1>, Desc<"Enable verbose logging.">; def log_sequence : Option<"sequence", "s">, Group<1>, Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -1448,8 +1448,7 @@ assert(log_handler_sp); if (log_options == 0) - log_options = - LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; + log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME; return Log::EnableLogChannel(log_handler_sp, log_options, channel, categories, error_stream); Index: lldb/source/Utility/Log.cpp =================================================================== --- lldb/source/Utility/Log.cpp +++ lldb/source/Utility/Log.cpp @@ -317,12 +317,7 @@ auto handler_sp = GetHandler(); if (!handler_sp) return; - - Flags options = GetOptions(); - if (options.Test(LLDB_LOG_OPTION_THREADSAFE)) - handler_sp->EmitThreadSafe(message); - else - handler_sp->Emit(message); + handler_sp->Emit(message); } void Log::Format(llvm::StringRef file, llvm::StringRef function, @@ -334,11 +329,6 @@ WriteMessage(message.str()); } -void LogHandler::EmitThreadSafe(llvm::StringRef message) { - std::lock_guard guard(m_mutex); - Emit(message); -} - StreamLogHandler::StreamLogHandler(int fd, bool should_close, size_t buffer_size) : m_stream(fd, should_close, false) { @@ -346,11 +336,21 @@ m_stream.SetBufferSize(buffer_size); } -StreamLogHandler::~StreamLogHandler() { +StreamLogHandler::~StreamLogHandler() { Flush(); } + +void StreamLogHandler::Flush() { + std::lock_guard guard(m_mutex); m_stream.flush(); } -void StreamLogHandler::Emit(llvm::StringRef message) { m_stream << message; } +void StreamLogHandler::Emit(llvm::StringRef message) { + if (m_stream.GetBufferSize() > 0) { + std::lock_guard guard(m_mutex); + m_stream << message; + } else { + m_stream << message; + } +} CallbackLogHandler::CallbackLogHandler(lldb::LogOutputCallback callback, void *baton) @@ -364,6 +364,7 @@ : m_messages(std::make_unique(size)), m_size(size) {} void RotatingLogHandler::Emit(llvm::StringRef message) { + std::lock_guard guard(m_mutex); ++m_total_count; const size_t index = m_next_index; m_next_index = NormalizeIndex(index + 1); @@ -381,6 +382,7 @@ } void RotatingLogHandler::Dump(llvm::raw_ostream &stream) const { + std::lock_guard guard(m_mutex); const size_t start_idx = GetFirstMessageIndex(); const size_t stop_idx = start_idx + GetNumMessages(); for (size_t i = start_idx; i < stop_idx; ++i) {