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;