diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp index 03faa9290666a..f53befefab938 100644 --- a/cmds/incidentd/src/PrivacyBuffer.cpp +++ b/cmds/incidentd/src/PrivacyBuffer.cpp @@ -142,7 +142,7 @@ void PrivacyBuffer::clear() { mSize = 0; - mProto = ProtoOutputStream(); + mProto.clear(); } size_t diff --git a/cmds/statsd/AndroidTest.xml b/cmds/statsd/AndroidTest.xml new file mode 100644 index 0000000000000..afe30a2690936 --- /dev/null +++ b/cmds/statsd/AndroidTest.xml @@ -0,0 +1,26 @@ + + + + + + \ No newline at end of file diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp index 63f6e2acd9df6..ba16ec83a5c5e 100644 --- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp +++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp @@ -19,7 +19,6 @@ #include "AnomalyTracker.h" #include "external/Perfetto.h" -#include "frameworks/base/libs/incident/proto/android/os/header.pb.h" #include "guardrail/StatsdStats.h" #include "subscriber/IncidentdReporter.h" #include "subscriber/SubscriberReporter.h" diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index 0578e0682687f..936a2ef1fde41 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -59,9 +59,7 @@ EventMetricProducer::EventMetricProducer(const ConfigKey& key, const EventMetric metric.links().end()); mConditionSliced = true; } - - startNewProtoOutputStreamLocked(); - + mProto = std::make_unique(); VLOG("metric %lld created. bucket size %lld start_time: %lld", (long long)metric.id(), (long long)mBucketSizeNs, (long long)mStartTimeNs); } @@ -70,10 +68,6 @@ EventMetricProducer::~EventMetricProducer() { VLOG("~EventMetricProducer() called"); } -void EventMetricProducer::startNewProtoOutputStreamLocked() { - mProto = std::make_unique(); -} - void EventMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) { } @@ -113,7 +107,7 @@ void EventMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, protoOutput->write(FIELD_TYPE_MESSAGE | FIELD_ID_EVENT_METRICS, reinterpret_cast(buffer.get()->data()), buffer.get()->size()); - startNewProtoOutputStreamLocked(); + mProto->clear(); } void EventMetricProducer::onConditionChangedLocked(const bool conditionMet, diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h index 935f206017fa2..394ed234f02e0 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.h +++ b/cmds/statsd/src/metrics/EventMetricProducer.h @@ -40,9 +40,6 @@ public: virtual ~EventMetricProducer(); -protected: - void startNewProtoOutputStreamLocked(); - private: void onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, diff --git a/libs/protoutil/include/android/util/EncodedBuffer.h b/libs/protoutil/include/android/util/EncodedBuffer.h index e568e4cf02fc2..0a8a5aa347bac 100644 --- a/libs/protoutil/include/android/util/EncodedBuffer.h +++ b/libs/protoutil/include/android/util/EncodedBuffer.h @@ -64,6 +64,11 @@ public: size_t mOffset; }; + /** + * Clears the buffer by rewinding its write pointer to avoid de/allocate buffers in heap. + */ + void clear(); + /******************************** Write APIs ************************************************/ /** diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h index faea9b21311dc..52830d397772a 100644 --- a/libs/protoutil/include/android/util/ProtoOutputStream.h +++ b/libs/protoutil/include/android/util/ProtoOutputStream.h @@ -123,6 +123,11 @@ public: EncodedBuffer::iterator data(); // Get the reader apis of the data. bool flush(int fd); // Flush data directly to a file descriptor. + /** + * Clears the ProtoOutputStream so the buffer can be reused instead of deallocation/allocation again. + */ + void clear(); + // Please don't use the following functions to dump protos unless you are familiar with protobuf encoding. void writeRawVarint(uint64_t varint); void writeLengthDelimitedHeader(uint32_t id, size_t size); diff --git a/libs/protoutil/src/EncodedBuffer.cpp b/libs/protoutil/src/EncodedBuffer.cpp index 435ae88362171..3a5e2e9ef5d0c 100644 --- a/libs/protoutil/src/EncodedBuffer.cpp +++ b/libs/protoutil/src/EncodedBuffer.cpp @@ -106,6 +106,13 @@ EncodedBuffer::at(const Pointer& p) const return mBuffers[p.index()] + p.offset(); } +void +EncodedBuffer::clear() +{ + mWp.rewind(); + mEp.rewind(); +} + /******************************** Write APIs ************************************************/ size_t EncodedBuffer::size() const diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index f24abaed2dcea..9d9ffec4c5887 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -36,6 +36,18 @@ ProtoOutputStream::~ProtoOutputStream() { } + +void +ProtoOutputStream::clear() +{ + mBuffer.clear(); + mCopyBegin = 0; + mCompact = false; + mDepth = 0; + mObjectId = 0; + mExpectedObjectToken = 0LL; +} + bool ProtoOutputStream::write(uint64_t fieldId, double val) {