logd: move current sequence from LogBufferElement to LogBuffer

This is required for tests that are aware of sequence numbers to pass;
each new LogBuffer instance should start from sequence = 1, which
isn't the case if the current sequence number is a static.

Test: unit tests
Change-Id: Ie488f8ac5e22b946b7e6237d1d5caf14929c0ec3
diff --git a/logd/ChattyLogBuffer.cpp b/logd/ChattyLogBuffer.cpp
index fd2c236..68e0dc6 100644
--- a/logd/ChattyLogBuffer.cpp
+++ b/logd/ChattyLogBuffer.cpp
@@ -177,7 +177,8 @@
     // exact entry with time specified in ms or us precision.
     if ((realtime.tv_nsec % 1000) == 0) ++realtime.tv_nsec;
 
-    LogBufferElement elem(log_id, realtime, uid, pid, tid, msg, len);
+    auto sequence = sequence_.fetch_add(1, std::memory_order_relaxed);
+    LogBufferElement elem(log_id, realtime, uid, pid, tid, sequence, msg, len);
 
     // b/137093665: don't coalesce security messages.
     if (log_id == LOG_ID_SECURITY) {
diff --git a/logd/ChattyLogBuffer.h b/logd/ChattyLogBuffer.h
index 08c4bff..257c8b3 100644
--- a/logd/ChattyLogBuffer.h
+++ b/logd/ChattyLogBuffer.h
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 
+#include <atomic>
 #include <list>
 #include <optional>
 #include <string>
@@ -67,6 +68,8 @@
     unsigned long GetSize(log_id_t id) override;
     int SetSize(log_id_t id, unsigned long size) override;
 
+    uint64_t sequence() const override { return sequence_.load(std::memory_order_relaxed); }
+
   private:
     void maybePrune(log_id_t id) REQUIRES(lock_);
     void kickMe(LogReaderThread* me, log_id_t id, unsigned long pruneRows) REQUIRES_SHARED(lock_);
@@ -92,6 +95,8 @@
 
     RwLock lock_;
 
+    std::atomic<uint64_t> sequence_ = 1;
+
     // This always contains a copy of the last message logged, for deduplication.
     std::optional<LogBufferElement> last_logged_elements_[LOG_ID_MAX] GUARDED_BY(lock_);
     // This contains an element if duplicate messages are seen.
diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h
index 6274051..7f1e128 100644
--- a/logd/LogBuffer.h
+++ b/logd/LogBuffer.h
@@ -53,4 +53,6 @@
     virtual bool Clear(log_id_t id, uid_t uid) = 0;
     virtual unsigned long GetSize(log_id_t id) = 0;
     virtual int SetSize(log_id_t id, unsigned long size) = 0;
+
+    virtual uint64_t sequence() const = 0;
 };
\ No newline at end of file
diff --git a/logd/LogBufferElement.cpp b/logd/LogBufferElement.cpp
index 3bcf11d..c6dbda8 100644
--- a/logd/LogBufferElement.cpp
+++ b/logd/LogBufferElement.cpp
@@ -30,14 +30,12 @@
 #include "LogStatistics.h"
 #include "LogUtils.h"
 
-atomic_int_fast64_t LogBufferElement::sequence(1);
-
 LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
-                                   pid_t tid, const char* msg, uint16_t len)
+                                   pid_t tid, uint64_t sequence, const char* msg, uint16_t len)
     : mUid(uid),
       mPid(pid),
       mTid(tid),
-      mSequence(sequence.fetch_add(1, memory_order_relaxed)),
+      mSequence(sequence),
       mRealTime(realtime),
       mMsgLen(len),
       mLogId(log_id),
diff --git a/logd/LogBufferElement.h b/logd/LogBufferElement.h
index a777970..35252f9 100644
--- a/logd/LogBufferElement.h
+++ b/logd/LogBufferElement.h
@@ -16,7 +16,6 @@
 
 #pragma once
 
-#include <stdatomic.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -51,14 +50,12 @@
     const uint8_t mLogId;
     bool mDropped;
 
-    static atomic_int_fast64_t sequence;
-
     // assumption: mDropped == true
     size_t populateDroppedMessage(char*& buffer, LogStatistics* parent, bool lastSame);
 
   public:
-    LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
-                     pid_t tid, const char* msg, uint16_t len);
+    LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid,
+                     uint64_t sequence, const char* msg, uint16_t len);
     LogBufferElement(const LogBufferElement& elem);
     LogBufferElement(LogBufferElement&& elem);
     ~LogBufferElement();
@@ -91,7 +88,6 @@
         return mDropped ? nullptr : mMsg;
     }
     uint64_t getSequence() const { return mSequence; }
-    static uint64_t getCurrentSequence() { return sequence.load(memory_order_relaxed); }
     log_time getRealTime(void) const {
         return mRealTime;
     }
diff --git a/logd/LogReader.cpp b/logd/LogReader.cpp
index 89562a4..234ddc7 100644
--- a/logd/LogReader.cpp
+++ b/logd/LogReader.cpp
@@ -200,7 +200,7 @@
             if (nonBlock) {
                 return false;
             }
-            sequence = LogBufferElement::getCurrentSequence();
+            sequence = log_buffer_->sequence();
         }
     }