Loading logd/SerializedFlushToState.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ SerializedFlushToState::SerializedFlushToState(uint64_t start, LogMask log_mask) SerializedFlushToState::~SerializedFlushToState() { log_id_for_each(i) { if (log_positions_[i]) { log_positions_[i]->buffer_it->DecReaderRefCount(true); log_positions_[i]->buffer_it->DecReaderRefCount(); } } } Loading Loading @@ -78,7 +78,7 @@ void SerializedFlushToState::AddMinHeapEntry(log_id_t log_id) { logs_needed_from_next_position_[log_id] = true; } else { // Otherwise, if there is another buffer piece, move to that and do the same check. buffer_it->DecReaderRefCount(true); buffer_it->DecReaderRefCount(); ++buffer_it; buffer_it->IncReaderRefCount(); log_positions_[log_id]->read_offset = 0; Loading Loading @@ -134,7 +134,7 @@ void SerializedFlushToState::Prune(log_id_t log_id, } // // Decrease the ref count since we're deleting our reference. buffer_it->DecReaderRefCount(false); buffer_it->DecReaderRefCount(); // Delete in the reference. log_positions_[log_id].reset(); Loading logd/SerializedLogBuffer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -123,7 +123,7 @@ void SerializedLogBuffer::RemoveChunkFromStats(log_id_t log_id, SerializedLogChu stats_->Subtract(entry->ToLogStatisticsElement(log_id)); read_offset += entry->total_len(); } chunk.DecReaderRefCount(false); chunk.DecReaderRefCount(); } void SerializedLogBuffer::NotifyReadersOfPrune( Loading logd/SerializedLogChunk.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ void SerializedLogChunk::Compress() { << " size used: " << write_offset_ << " compressed size: " << compressed_log_.size(); } contents_.Resize(0); } // TODO: Develop a better reference counting strategy to guard against the case where the writer is Loading @@ -44,13 +43,13 @@ void SerializedLogChunk::IncReaderRefCount() { CompressionEngine::GetInstance().Decompress(compressed_log_, contents_); } void SerializedLogChunk::DecReaderRefCount(bool compress) { void SerializedLogChunk::DecReaderRefCount() { CHECK_NE(reader_ref_count_, 0U); if (--reader_ref_count_ != 0) { return; } if (compress && !writer_active_) { Compress(); if (!writer_active_) { contents_.Resize(0); } } Loading Loading @@ -83,18 +82,19 @@ bool SerializedLogChunk::ClearUidLogs(uid_t uid, log_id_t log_id, LogStatistics* } if (new_write_offset == 0) { DecReaderRefCount(false); DecReaderRefCount(); return true; } // Clear the old compressed logs and set write_offset_ appropriately for DecReaderRefCount() // to compress the new partially cleared log. // Clear the old compressed logs and set write_offset_ appropriately to compress the new // partially cleared log. if (new_write_offset != write_offset_) { compressed_log_.Resize(0); write_offset_ = new_write_offset; Compress(); } DecReaderRefCount(true); DecReaderRefCount(); return false; } Loading logd/SerializedLogChunk.h +3 −4 Original line number Diff line number Diff line Loading @@ -30,9 +30,7 @@ class SerializedLogChunk { void Compress(); void IncReaderRefCount(); // Decrease the reader ref count and compress the log if appropriate. `compress` should only be // set to false in the case that the log buffer will be deleted afterwards. void DecReaderRefCount(bool compress); void DecReaderRefCount(); // Must have no readers referencing this. Return true if there are no logs left in this chunk. bool ClearUidLogs(uid_t uid, log_id_t log_id, LogStatistics* stats); Loading @@ -50,8 +48,9 @@ class SerializedLogChunk { void FinishWriting() { writer_active_ = false; if (reader_ref_count_ == 0) { Compress(); if (reader_ref_count_ == 0) { contents_.Resize(0); } } Loading logd/SerializedLogChunkTest.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -113,8 +113,7 @@ TEST(SerializedLogChunk, three_logs) { TEST(SerializedLogChunk, catch_DecCompressedRef_CHECK) { size_t chunk_size = 10 * 4096; auto chunk = SerializedLogChunk{chunk_size}; EXPECT_DEATH({ chunk.DecReaderRefCount(true); }, ""); EXPECT_DEATH({ chunk.DecReaderRefCount(false); }, ""); EXPECT_DEATH({ chunk.DecReaderRefCount(); }, ""); } // Check that the CHECK() in ClearUidLogs() if the ref count is greater than 0 is caught. Loading @@ -123,7 +122,7 @@ TEST(SerializedLogChunk, catch_ClearUidLogs_CHECK) { auto chunk = SerializedLogChunk{chunk_size}; chunk.IncReaderRefCount(); EXPECT_DEATH({ chunk.ClearUidLogs(1000, LOG_ID_MAIN, nullptr); }, ""); chunk.DecReaderRefCount(false); chunk.DecReaderRefCount(); } class UidClearTest : public testing::TestWithParam<bool> { Loading @@ -144,7 +143,7 @@ class UidClearTest : public testing::TestWithParam<bool> { check(chunk_); if (finish_writing) { chunk_.DecReaderRefCount(false); chunk_.DecReaderRefCount(); } } Loading Loading
logd/SerializedFlushToState.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ SerializedFlushToState::SerializedFlushToState(uint64_t start, LogMask log_mask) SerializedFlushToState::~SerializedFlushToState() { log_id_for_each(i) { if (log_positions_[i]) { log_positions_[i]->buffer_it->DecReaderRefCount(true); log_positions_[i]->buffer_it->DecReaderRefCount(); } } } Loading Loading @@ -78,7 +78,7 @@ void SerializedFlushToState::AddMinHeapEntry(log_id_t log_id) { logs_needed_from_next_position_[log_id] = true; } else { // Otherwise, if there is another buffer piece, move to that and do the same check. buffer_it->DecReaderRefCount(true); buffer_it->DecReaderRefCount(); ++buffer_it; buffer_it->IncReaderRefCount(); log_positions_[log_id]->read_offset = 0; Loading Loading @@ -134,7 +134,7 @@ void SerializedFlushToState::Prune(log_id_t log_id, } // // Decrease the ref count since we're deleting our reference. buffer_it->DecReaderRefCount(false); buffer_it->DecReaderRefCount(); // Delete in the reference. log_positions_[log_id].reset(); Loading
logd/SerializedLogBuffer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -123,7 +123,7 @@ void SerializedLogBuffer::RemoveChunkFromStats(log_id_t log_id, SerializedLogChu stats_->Subtract(entry->ToLogStatisticsElement(log_id)); read_offset += entry->total_len(); } chunk.DecReaderRefCount(false); chunk.DecReaderRefCount(); } void SerializedLogBuffer::NotifyReadersOfPrune( Loading
logd/SerializedLogChunk.cpp +8 −8 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ void SerializedLogChunk::Compress() { << " size used: " << write_offset_ << " compressed size: " << compressed_log_.size(); } contents_.Resize(0); } // TODO: Develop a better reference counting strategy to guard against the case where the writer is Loading @@ -44,13 +43,13 @@ void SerializedLogChunk::IncReaderRefCount() { CompressionEngine::GetInstance().Decompress(compressed_log_, contents_); } void SerializedLogChunk::DecReaderRefCount(bool compress) { void SerializedLogChunk::DecReaderRefCount() { CHECK_NE(reader_ref_count_, 0U); if (--reader_ref_count_ != 0) { return; } if (compress && !writer_active_) { Compress(); if (!writer_active_) { contents_.Resize(0); } } Loading Loading @@ -83,18 +82,19 @@ bool SerializedLogChunk::ClearUidLogs(uid_t uid, log_id_t log_id, LogStatistics* } if (new_write_offset == 0) { DecReaderRefCount(false); DecReaderRefCount(); return true; } // Clear the old compressed logs and set write_offset_ appropriately for DecReaderRefCount() // to compress the new partially cleared log. // Clear the old compressed logs and set write_offset_ appropriately to compress the new // partially cleared log. if (new_write_offset != write_offset_) { compressed_log_.Resize(0); write_offset_ = new_write_offset; Compress(); } DecReaderRefCount(true); DecReaderRefCount(); return false; } Loading
logd/SerializedLogChunk.h +3 −4 Original line number Diff line number Diff line Loading @@ -30,9 +30,7 @@ class SerializedLogChunk { void Compress(); void IncReaderRefCount(); // Decrease the reader ref count and compress the log if appropriate. `compress` should only be // set to false in the case that the log buffer will be deleted afterwards. void DecReaderRefCount(bool compress); void DecReaderRefCount(); // Must have no readers referencing this. Return true if there are no logs left in this chunk. bool ClearUidLogs(uid_t uid, log_id_t log_id, LogStatistics* stats); Loading @@ -50,8 +48,9 @@ class SerializedLogChunk { void FinishWriting() { writer_active_ = false; if (reader_ref_count_ == 0) { Compress(); if (reader_ref_count_ == 0) { contents_.Resize(0); } } Loading
logd/SerializedLogChunkTest.cpp +3 −4 Original line number Diff line number Diff line Loading @@ -113,8 +113,7 @@ TEST(SerializedLogChunk, three_logs) { TEST(SerializedLogChunk, catch_DecCompressedRef_CHECK) { size_t chunk_size = 10 * 4096; auto chunk = SerializedLogChunk{chunk_size}; EXPECT_DEATH({ chunk.DecReaderRefCount(true); }, ""); EXPECT_DEATH({ chunk.DecReaderRefCount(false); }, ""); EXPECT_DEATH({ chunk.DecReaderRefCount(); }, ""); } // Check that the CHECK() in ClearUidLogs() if the ref count is greater than 0 is caught. Loading @@ -123,7 +122,7 @@ TEST(SerializedLogChunk, catch_ClearUidLogs_CHECK) { auto chunk = SerializedLogChunk{chunk_size}; chunk.IncReaderRefCount(); EXPECT_DEATH({ chunk.ClearUidLogs(1000, LOG_ID_MAIN, nullptr); }, ""); chunk.DecReaderRefCount(false); chunk.DecReaderRefCount(); } class UidClearTest : public testing::TestWithParam<bool> { Loading @@ -144,7 +143,7 @@ class UidClearTest : public testing::TestWithParam<bool> { check(chunk_); if (finish_writing) { chunk_.DecReaderRefCount(false); chunk_.DecReaderRefCount(); } } Loading