diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h index a98c4b971..025926650 100644 --- a/logd/LogBuffer.h +++ b/logd/LogBuffer.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -62,6 +63,7 @@ class LogBuffer { const char* msg, uint16_t len) = 0; virtual std::unique_ptr CreateFlushToState(uint64_t start, LogMask log_mask) = 0; + virtual void DeleteFlushToState(std::unique_ptr) {} virtual bool FlushTo( LogWriter* writer, FlushToState& state, const std::functionDeleteFlushToState(std::move(first_pass_state)); } bool flush_success = log_buffer_->FlushTo( writer_.get(), *flush_to_state_, @@ -105,6 +106,10 @@ void LogReaderThread::ThreadFunction() { } } + lock.unlock(); + log_buffer_->DeleteFlushToState(std::move(flush_to_state_)); + lock.lock(); + writer_->Release(); auto& log_reader_threads = reader_list_->reader_threads(); diff --git a/logd/LogReaderThread.h b/logd/LogReaderThread.h index 20624f2e4..f1b673fa1 100644 --- a/logd/LogReaderThread.h +++ b/logd/LogReaderThread.h @@ -53,7 +53,7 @@ class LogReaderThread { bool IsWatching(log_id_t id) const { return flush_to_state_->log_mask() & (1 << id); } bool IsWatchingMultiple(LogMask log_mask) const { - return flush_to_state_->log_mask() & log_mask; + return flush_to_state_ && flush_to_state_->log_mask() & log_mask; } std::string name() const { return writer_->name(); } diff --git a/logd/SerializedLogBuffer.cpp b/logd/SerializedLogBuffer.cpp index fa90878a8..6d1576f7a 100644 --- a/logd/SerializedLogBuffer.cpp +++ b/logd/SerializedLogBuffer.cpp @@ -201,6 +201,11 @@ std::unique_ptr SerializedLogBuffer::CreateFlushToState(uint64_t s return std::make_unique(start, log_mask); } +void SerializedLogBuffer::DeleteFlushToState(std::unique_ptr state) { + auto lock = std::unique_lock{lock_}; + state.reset(); +} + bool SerializedLogBuffer::FlushTo( LogWriter* writer, FlushToState& abstract_state, const std::function CreateFlushToState(uint64_t start, LogMask log_mask) override; + void DeleteFlushToState(std::unique_ptr state) override; bool FlushTo(LogWriter* writer, FlushToState& state, const std::function& filter) override;