logd: remove LogBufferElement dependency of LogReaderThread
In the future, not all log buffers will be implemented in terms of
LogBufferElement.
Test: build
Change-Id: I5cf0d01414857b1bfa08c92a4f8035b43ef2aad7
diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h
index d38c018..859d740 100644
--- a/logd/LogBuffer.h
+++ b/logd/LogBuffer.h
@@ -21,11 +21,9 @@
#include <functional>
#include <log/log.h>
-#include <sysutils/SocketClient.h>
+#include <log/log_read.h>
-#include "LogBufferElement.h"
-
-class LogWriter;
+#include "LogWriter.h"
enum class FilterResult {
kSkip,
@@ -45,10 +43,11 @@
// valid message was from the same source so we can differentiate chatty
// filter types (identical or expired)
static const uint64_t FLUSH_ERROR = 0;
- virtual uint64_t FlushTo(
- LogWriter* writer, uint64_t start,
- pid_t* last_tid, // nullable
- const std::function<FilterResult(const LogBufferElement* element)>& filter) = 0;
+ virtual uint64_t FlushTo(LogWriter* writer, uint64_t start,
+ pid_t* last_tid, // nullable
+ const std::function<FilterResult(log_id_t log_id, pid_t pid,
+ uint64_t sequence, log_time realtime,
+ uint16_t dropped_count)>& filter) = 0;
virtual bool Clear(log_id_t id, uid_t uid) = 0;
virtual unsigned long GetSize(log_id_t id) = 0;
diff --git a/logd/LogReader.cpp b/logd/LogReader.cpp
index 26f2ed2..35c46aa 100644
--- a/logd/LogReader.cpp
+++ b/logd/LogReader.cpp
@@ -171,25 +171,27 @@
if (start != log_time::EPOCH) {
bool start_time_set = false;
uint64_t last = sequence;
- auto log_find_start = [pid, logMask, start, &sequence, &start_time_set,
- &last](const LogBufferElement* element) -> FilterResult {
- if (pid && pid != element->getPid()) {
+ auto log_find_start = [pid, logMask, start, &sequence, &start_time_set, &last](
+ log_id_t element_log_id, pid_t element_pid,
+ uint64_t element_sequence, log_time element_realtime,
+ uint16_t) -> FilterResult {
+ if (pid && pid != element_pid) {
return FilterResult::kSkip;
}
- if ((logMask & (1 << element->getLogId())) == 0) {
+ if ((logMask & (1 << element_log_id)) == 0) {
return FilterResult::kSkip;
}
- if (start == element->getRealTime()) {
- sequence = element->getSequence();
+ if (start == element_realtime) {
+ sequence = element_sequence;
start_time_set = true;
return FilterResult::kStop;
} else {
- if (start < element->getRealTime()) {
+ if (start < element_realtime) {
sequence = last;
start_time_set = true;
return FilterResult::kStop;
}
- last = element->getSequence();
+ last = element_sequence;
}
return FilterResult::kSkip;
};
diff --git a/logd/LogReaderThread.cpp b/logd/LogReaderThread.cpp
index 8de9622..3a83f3f 100644
--- a/logd/LogReaderThread.cpp
+++ b/logd/LogReaderThread.cpp
@@ -75,13 +75,21 @@
if (tail_) {
log_buffer_->FlushTo(writer_.get(), start, nullptr,
- std::bind(&LogReaderThread::FilterFirstPass, this, _1));
+ [this](log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count) {
+ return FilterFirstPass(log_id, pid, sequence, realtime,
+ dropped_count);
+ });
leading_dropped_ =
true; // TODO: Likely a bug, if leading_dropped_ was not true before calling
// flushTo(), then it should not be reset to true after.
}
start = log_buffer_->FlushTo(writer_.get(), start, last_tid_,
- std::bind(&LogReaderThread::FilterSecondPass, this, _1));
+ [this](log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count) {
+ return FilterSecondPass(log_id, pid, sequence, realtime,
+ dropped_count);
+ });
// We only ignore entries before the original start time for the first flushTo(), if we
// get entries after this first flush before the original start time, then the client
@@ -123,22 +131,23 @@
}
// A first pass to count the number of elements
-FilterResult LogReaderThread::FilterFirstPass(const LogBufferElement* element) {
+FilterResult LogReaderThread::FilterFirstPass(log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count) {
auto lock = std::lock_guard{reader_list_->reader_threads_lock()};
if (leading_dropped_) {
- if (element->getDropped()) {
+ if (dropped_count) {
return FilterResult::kSkip;
}
leading_dropped_ = false;
}
if (count_ == 0) {
- start_ = element->getSequence();
+ start_ = sequence;
}
- if ((!pid_ || pid_ == element->getPid()) && IsWatching(element->getLogId()) &&
- (start_time_ == log_time::EPOCH || start_time_ <= element->getRealTime())) {
+ if ((!pid_ || pid_ == pid) && IsWatching(log_id) &&
+ (start_time_ == log_time::EPOCH || start_time_ <= realtime)) {
++count_;
}
@@ -146,18 +155,19 @@
}
// A second pass to send the selected elements
-FilterResult LogReaderThread::FilterSecondPass(const LogBufferElement* element) {
+FilterResult LogReaderThread::FilterSecondPass(log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count) {
auto lock = std::lock_guard{reader_list_->reader_threads_lock()};
- start_ = element->getSequence();
+ start_ = sequence;
- if (skip_ahead_[element->getLogId()]) {
- skip_ahead_[element->getLogId()]--;
+ if (skip_ahead_[log_id]) {
+ skip_ahead_[log_id]--;
return FilterResult::kSkip;
}
if (leading_dropped_) {
- if (element->getDropped()) {
+ if (dropped_count) {
return FilterResult::kSkip;
}
leading_dropped_ = false;
@@ -168,15 +178,15 @@
return FilterResult::kStop;
}
- if (!IsWatching(element->getLogId())) {
+ if (!IsWatching(log_id)) {
return FilterResult::kSkip;
}
- if (pid_ && pid_ != element->getPid()) {
+ if (pid_ && pid_ != pid) {
return FilterResult::kSkip;
}
- if (start_time_ != log_time::EPOCH && element->getRealTime() <= start_time_) {
+ if (start_time_ != log_time::EPOCH && realtime <= start_time_) {
return FilterResult::kSkip;
}
@@ -199,7 +209,7 @@
}
ok:
- if (!skip_ahead_[element->getLogId()]) {
+ if (!skip_ahead_[log_id]) {
return FilterResult::kWrite;
}
return FilterResult::kSkip;
diff --git a/logd/LogReaderThread.h b/logd/LogReaderThread.h
index 907bc83..ba81063 100644
--- a/logd/LogReaderThread.h
+++ b/logd/LogReaderThread.h
@@ -30,7 +30,6 @@
#include <sysutils/SocketClient.h>
#include "LogBuffer.h"
-#include "LogBufferElement.h"
#include "LogWriter.h"
class LogReaderList;
@@ -63,8 +62,10 @@
private:
void ThreadFunction();
// flushTo filter callbacks
- FilterResult FilterFirstPass(const LogBufferElement* element);
- FilterResult FilterSecondPass(const LogBufferElement* element);
+ FilterResult FilterFirstPass(log_id_t log_id, pid_t pid, uint64_t sequence, log_time realtime,
+ uint16_t dropped_count);
+ FilterResult FilterSecondPass(log_id_t log_id, pid_t pid, uint64_t sequence, log_time realtime,
+ uint16_t dropped_count);
std::condition_variable thread_triggered_condition_;
LogBuffer* log_buffer_;
diff --git a/logd/SimpleLogBuffer.cpp b/logd/SimpleLogBuffer.cpp
index d60805d..8a11b92 100644
--- a/logd/SimpleLogBuffer.cpp
+++ b/logd/SimpleLogBuffer.cpp
@@ -112,7 +112,8 @@
uint64_t SimpleLogBuffer::FlushTo(
LogWriter* writer, uint64_t start, pid_t* last_tid,
- const std::function<FilterResult(const LogBufferElement* element)>& filter) {
+ const std::function<FilterResult(log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count)>& filter) {
auto shared_lock = SharedLock{lock_};
std::list<LogBufferElement>::iterator it;
@@ -146,7 +147,8 @@
}
if (filter) {
- FilterResult ret = filter(&element);
+ FilterResult ret = filter(element.getLogId(), element.getPid(), element.getSequence(),
+ element.getRealTime(), element.getDropped());
if (ret == FilterResult::kSkip) {
continue;
}
diff --git a/logd/SimpleLogBuffer.h b/logd/SimpleLogBuffer.h
index cd08acf..72d26b0 100644
--- a/logd/SimpleLogBuffer.h
+++ b/logd/SimpleLogBuffer.h
@@ -35,9 +35,10 @@
int Log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid, const char* msg,
uint16_t len) override;
- uint64_t FlushTo(
- LogWriter* writer, uint64_t start, pid_t* lastTid,
- const std::function<FilterResult(const LogBufferElement* element)>& filter) override;
+ uint64_t FlushTo(LogWriter* writer, uint64_t start, pid_t* lastTid,
+ const std::function<FilterResult(log_id_t log_id, pid_t pid, uint64_t sequence,
+ log_time realtime, uint16_t dropped_count)>&
+ filter) override;
bool Clear(log_id_t id, uid_t uid) override;
unsigned long GetSize(log_id_t id) override;