summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Cherry <tomcherry@google.com>2020-05-21 13:56:33 -0700
committerTom Cherry <tomcherry@google.com>2020-05-21 14:10:17 -0700
commita3c5ff5d3f38718b9786f64f8e8fb1f91fe96bf9 (patch)
tree6c3f4054541171e3d708131f785cea70557f04e5
parentf29cd20df55217e64c9bee34fffcd95ca3f81318 (diff)
downloadcore-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.cpp3
-rw-r--r--logd/ChattyLogBuffer.h5
-rw-r--r--logd/LogBuffer.h2
-rw-r--r--logd/LogBufferElement.cpp6
-rw-r--r--logd/LogBufferElement.h8
-rw-r--r--logd/LogReader.cpp2
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();
}
}