diff options
author | Tom Cherry <tomcherry@google.com> | 2020-05-21 13:56:33 -0700 |
---|---|---|
committer | Tom Cherry <tomcherry@google.com> | 2020-05-21 14:10:17 -0700 |
commit | a3c5ff5d3f38718b9786f64f8e8fb1f91fe96bf9 (patch) | |
tree | 6c3f4054541171e3d708131f785cea70557f04e5 | |
parent | f29cd20df55217e64c9bee34fffcd95ca3f81318 (diff) | |
download | core-a3c5ff5d3f38718b9786f64f8e8fb1f91fe96bf9.tar.gz |
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
-rw-r--r-- | logd/ChattyLogBuffer.cpp | 3 | ||||
-rw-r--r-- | logd/ChattyLogBuffer.h | 5 | ||||
-rw-r--r-- | logd/LogBuffer.h | 2 | ||||
-rw-r--r-- | logd/LogBufferElement.cpp | 6 | ||||
-rw-r--r-- | logd/LogBufferElement.h | 8 | ||||
-rw-r--r-- | logd/LogReader.cpp | 2 |
6 files changed, 14 insertions, 12 deletions
diff --git a/logd/ChattyLogBuffer.cpp b/logd/ChattyLogBuffer.cpp index fd2c23691..68e0dc606 100644 --- a/logd/ChattyLogBuffer.cpp +++ b/logd/ChattyLogBuffer.cpp @@ -177,7 +177,8 @@ int ChattyLogBuffer::Log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pi // 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 08c4bffe4..257c8b3a6 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 @@ class ChattyLogBuffer : public LogBuffer { 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 @@ class ChattyLogBuffer : public LogBuffer { 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 6274051ec..7f1e1284e 100644 --- a/logd/LogBuffer.h +++ b/logd/LogBuffer.h @@ -53,4 +53,6 @@ class LogBuffer { 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 3bcf11deb..c6dbda86d 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 a777970d4..35252f9c9 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 @@ class __attribute__((packed)) LogBufferElement { 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 @@ class __attribute__((packed)) LogBufferElement { 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 89562a414..234ddc75b 100644 --- a/logd/LogReader.cpp +++ b/logd/LogReader.cpp @@ -200,7 +200,7 @@ bool LogReader::onDataAvailable(SocketClient* cli) { if (nonBlock) { return false; } - sequence = LogBufferElement::getCurrentSequence(); + sequence = log_buffer_->sequence(); } } |