Loading cmds/statsd/src/external/StatsCallbackPuller.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -66,10 +66,8 @@ bool StatsCallbackPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { { lock_guard<mutex> lk(*cv_mutex); for (const StatsEventParcel& parcel: output) { uint8_t* buf = reinterpret_cast<uint8_t*>( const_cast<int8_t*>(parcel.buffer.data())); shared_ptr<LogEvent> event = make_shared<LogEvent>( buf, parcel.buffer.size(), /*uid=*/-1, /*pid=*/-1); shared_ptr<LogEvent> event = make_shared<LogEvent>(/*uid=*/-1, /*pid=*/-1); event->parseBuffer((uint8_t*)parcel.buffer.data(), parcel.buffer.size()); sharedData->push_back(event); } *pullSuccess = success; Loading cmds/statsd/src/logd/LogEvent.cpp +11 −16 Original line number Diff line number Diff line Loading @@ -65,18 +65,6 @@ using std::vector; #define ATTRIBUTION_CHAIN_TYPE 0x09 #define ERROR_TYPE 0x0F // Msg is expected to begin at the start of the serialized atom -- it should not // include the android_log_header_t or the StatsEventTag. LogEvent::LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid) : mBuf(msg), mRemainingLen(len), mLogdTimestampNs(time(nullptr)), mLogUid(uid), mLogPid(pid) { initNew(); } LogEvent::LogEvent(const LogEvent& event) { mTagId = event.mTagId; mLogUid = event.mLogUid; Loading @@ -86,6 +74,12 @@ LogEvent::LogEvent(const LogEvent& event) { mValues = event.mValues; } LogEvent::LogEvent(int32_t uid, int32_t pid) : mLogdTimestampNs(time(nullptr)), mLogUid(uid), mLogPid(pid) { } LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) { mLogdTimestampNs = wallClockTimestampNs; mElapsedTimestampNs = elapsedTimestampNs; Loading Loading @@ -189,9 +183,6 @@ LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status))); } LogEvent::LogEvent(int32_t tagId, int64_t timestampNs) : LogEvent(tagId, timestampNs, timestampNs) { } LogEvent::LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid) { mLogdTimestampNs = timestampNs; mTagId = tagId; Loading Loading @@ -467,7 +458,10 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last) { // This parsing logic is tied to the encoding scheme used in StatsEvent.java and // stats_event.c void LogEvent::initNew() { bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { mBuf = buf; mRemainingLen = (uint32_t)len; int32_t pos[] = {1, 1, 1}; bool last[] = {false, false, false}; Loading Loading @@ -529,6 +523,7 @@ void LogEvent::initNew() { if (mRemainingLen != 0) mValid = false; mBuf = nullptr; return mValid; } uint8_t LogEvent::getTypeId(uint8_t typeInfo) { Loading cmds/statsd/src/logd/LogEvent.h +27 −22 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <android/util/ProtoOutputStream.h> #include <private/android_logger.h> #include <stats_event.h> #include <string> #include <vector> Loading Loading @@ -61,23 +60,38 @@ struct InstallTrainInfo { }; /** * Wrapper for the log_msg structure. * This class decodes the structured, serialized encoding of an atom into a * vector of FieldValues. */ class LogEvent { public: /** * Read a LogEvent from the socket * \param uid user id of the logging caller * \param pid process id of the logging caller */ explicit LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid); explicit LogEvent(int32_t uid, int32_t pid); /** * Parses the atomId, timestamp, and vector of values from a buffer * containing the StatsEvent/AStatsEvent encoding of an atom. * * \param buf a buffer that begins at the start of the serialized atom (it * should not include the android_log_header_t or the StatsEventTag) * \param len size of the buffer * * \return success of the initialization */ bool parseBuffer(uint8_t* buf, size_t len); // TODO(b/149590301): delete unused functions below once LogEvent uses the // new socket schema within test code. Really we would like the only entry // points into LogEvent to be the above constructor and parseBuffer functions. /** * Constructs a LogEvent with synthetic data for testing. Must call init() before reading. */ explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs); // For testing. The timestamp is used as both elapsed real time and logd timestamp. explicit LogEvent(int32_t tagId, int64_t timestampNs); // For testing. The timestamp is used as both elapsed real time and logd timestamp. explicit LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid); Loading Loading @@ -192,10 +206,6 @@ public: return &mValues; } bool isValid() { return mValid; } inline LogEvent makeCopy() { return LogEvent(*this); } Loading @@ -222,12 +232,6 @@ private: */ LogEvent(const LogEvent&); /** * Parsing function for new encoding scheme. */ void initNew(); void parseInt32(int32_t* pos, int32_t depth, bool* last); void parseInt64(int32_t* pos, int32_t depth, bool* last); void parseString(int32_t* pos, int32_t depth, bool* last); Loading @@ -238,13 +242,14 @@ private: void parseAttributionChain(int32_t* pos, int32_t depth, bool* last); /** * mBuf is a pointer to the current location in the buffer being parsed. * Because the buffer lives on the StatsSocketListener stack, this pointer * is only valid during the LogEvent constructor. It will be set to null at * the end of initNew. * The below three variables are only valid during the execution of * parseBuffer. There are no guarantees about the state of these variables * before/after. * * TODO (b/150312423): These shouldn't be member variables. We should pass * them around as parameters. */ uint8_t* mBuf; uint32_t mRemainingLen; // number of valid bytes left in the buffer being parsed bool mValid = true; // stores whether the event we received from the socket is valid Loading cmds/statsd/src/socket/StatsSocketListener.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -126,7 +126,10 @@ bool StatsSocketListener::onDataAvailable(SocketClient* cli) { uint32_t pid = cred->pid; int64_t oldestTimestamp; if (!mQueue->push(std::make_unique<LogEvent>(msg, len, uid, pid), &oldestTimestamp)) { std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(uid, pid); logEvent->parseBuffer(msg, len); if (!mQueue->push(std::move(logEvent), &oldestTimestamp)) { StatsdStats::getInstance().noteEventQueueOverflow(oldestTimestamp); } Loading cmds/statsd/tests/LogEvent_test.cpp +15 −10 Original line number Diff line number Diff line Loading @@ -54,8 +54,9 @@ TEST(LogEventTest, TestPrimitiveParsing) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -102,8 +103,9 @@ TEST(LogEventTest, TestStringAndByteArrayParsing) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -137,8 +139,9 @@ TEST(LogEventTest, TestEmptyString) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading @@ -165,8 +168,9 @@ TEST(LogEventTest, TestByteArrayWithNullCharacter) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -200,8 +204,9 @@ TEST(LogEventTest, TestAttributionChain) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading
cmds/statsd/src/external/StatsCallbackPuller.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -66,10 +66,8 @@ bool StatsCallbackPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { { lock_guard<mutex> lk(*cv_mutex); for (const StatsEventParcel& parcel: output) { uint8_t* buf = reinterpret_cast<uint8_t*>( const_cast<int8_t*>(parcel.buffer.data())); shared_ptr<LogEvent> event = make_shared<LogEvent>( buf, parcel.buffer.size(), /*uid=*/-1, /*pid=*/-1); shared_ptr<LogEvent> event = make_shared<LogEvent>(/*uid=*/-1, /*pid=*/-1); event->parseBuffer((uint8_t*)parcel.buffer.data(), parcel.buffer.size()); sharedData->push_back(event); } *pullSuccess = success; Loading
cmds/statsd/src/logd/LogEvent.cpp +11 −16 Original line number Diff line number Diff line Loading @@ -65,18 +65,6 @@ using std::vector; #define ATTRIBUTION_CHAIN_TYPE 0x09 #define ERROR_TYPE 0x0F // Msg is expected to begin at the start of the serialized atom -- it should not // include the android_log_header_t or the StatsEventTag. LogEvent::LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid) : mBuf(msg), mRemainingLen(len), mLogdTimestampNs(time(nullptr)), mLogUid(uid), mLogPid(pid) { initNew(); } LogEvent::LogEvent(const LogEvent& event) { mTagId = event.mTagId; mLogUid = event.mLogUid; Loading @@ -86,6 +74,12 @@ LogEvent::LogEvent(const LogEvent& event) { mValues = event.mValues; } LogEvent::LogEvent(int32_t uid, int32_t pid) : mLogdTimestampNs(time(nullptr)), mLogUid(uid), mLogPid(pid) { } LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) { mLogdTimestampNs = wallClockTimestampNs; mElapsedTimestampNs = elapsedTimestampNs; Loading Loading @@ -189,9 +183,6 @@ LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs, mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status))); } LogEvent::LogEvent(int32_t tagId, int64_t timestampNs) : LogEvent(tagId, timestampNs, timestampNs) { } LogEvent::LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid) { mLogdTimestampNs = timestampNs; mTagId = tagId; Loading Loading @@ -467,7 +458,10 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last) { // This parsing logic is tied to the encoding scheme used in StatsEvent.java and // stats_event.c void LogEvent::initNew() { bool LogEvent::parseBuffer(uint8_t* buf, size_t len) { mBuf = buf; mRemainingLen = (uint32_t)len; int32_t pos[] = {1, 1, 1}; bool last[] = {false, false, false}; Loading Loading @@ -529,6 +523,7 @@ void LogEvent::initNew() { if (mRemainingLen != 0) mValid = false; mBuf = nullptr; return mValid; } uint8_t LogEvent::getTypeId(uint8_t typeInfo) { Loading
cmds/statsd/src/logd/LogEvent.h +27 −22 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ #include <android/util/ProtoOutputStream.h> #include <private/android_logger.h> #include <stats_event.h> #include <string> #include <vector> Loading Loading @@ -61,23 +60,38 @@ struct InstallTrainInfo { }; /** * Wrapper for the log_msg structure. * This class decodes the structured, serialized encoding of an atom into a * vector of FieldValues. */ class LogEvent { public: /** * Read a LogEvent from the socket * \param uid user id of the logging caller * \param pid process id of the logging caller */ explicit LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid); explicit LogEvent(int32_t uid, int32_t pid); /** * Parses the atomId, timestamp, and vector of values from a buffer * containing the StatsEvent/AStatsEvent encoding of an atom. * * \param buf a buffer that begins at the start of the serialized atom (it * should not include the android_log_header_t or the StatsEventTag) * \param len size of the buffer * * \return success of the initialization */ bool parseBuffer(uint8_t* buf, size_t len); // TODO(b/149590301): delete unused functions below once LogEvent uses the // new socket schema within test code. Really we would like the only entry // points into LogEvent to be the above constructor and parseBuffer functions. /** * Constructs a LogEvent with synthetic data for testing. Must call init() before reading. */ explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs); // For testing. The timestamp is used as both elapsed real time and logd timestamp. explicit LogEvent(int32_t tagId, int64_t timestampNs); // For testing. The timestamp is used as both elapsed real time and logd timestamp. explicit LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid); Loading Loading @@ -192,10 +206,6 @@ public: return &mValues; } bool isValid() { return mValid; } inline LogEvent makeCopy() { return LogEvent(*this); } Loading @@ -222,12 +232,6 @@ private: */ LogEvent(const LogEvent&); /** * Parsing function for new encoding scheme. */ void initNew(); void parseInt32(int32_t* pos, int32_t depth, bool* last); void parseInt64(int32_t* pos, int32_t depth, bool* last); void parseString(int32_t* pos, int32_t depth, bool* last); Loading @@ -238,13 +242,14 @@ private: void parseAttributionChain(int32_t* pos, int32_t depth, bool* last); /** * mBuf is a pointer to the current location in the buffer being parsed. * Because the buffer lives on the StatsSocketListener stack, this pointer * is only valid during the LogEvent constructor. It will be set to null at * the end of initNew. * The below three variables are only valid during the execution of * parseBuffer. There are no guarantees about the state of these variables * before/after. * * TODO (b/150312423): These shouldn't be member variables. We should pass * them around as parameters. */ uint8_t* mBuf; uint32_t mRemainingLen; // number of valid bytes left in the buffer being parsed bool mValid = true; // stores whether the event we received from the socket is valid Loading
cmds/statsd/src/socket/StatsSocketListener.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -126,7 +126,10 @@ bool StatsSocketListener::onDataAvailable(SocketClient* cli) { uint32_t pid = cred->pid; int64_t oldestTimestamp; if (!mQueue->push(std::make_unique<LogEvent>(msg, len, uid, pid), &oldestTimestamp)) { std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(uid, pid); logEvent->parseBuffer(msg, len); if (!mQueue->push(std::move(logEvent), &oldestTimestamp)) { StatsdStats::getInstance().noteEventQueueOverflow(oldestTimestamp); } Loading
cmds/statsd/tests/LogEvent_test.cpp +15 −10 Original line number Diff line number Diff line Loading @@ -54,8 +54,9 @@ TEST(LogEventTest, TestPrimitiveParsing) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -102,8 +103,9 @@ TEST(LogEventTest, TestStringAndByteArrayParsing) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -137,8 +139,9 @@ TEST(LogEventTest, TestEmptyString) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading @@ -165,8 +168,9 @@ TEST(LogEventTest, TestByteArrayWithNullCharacter) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading Loading @@ -200,8 +204,9 @@ TEST(LogEventTest, TestAttributionChain) { size_t size; uint8_t* buf = AStatsEvent_getBuffer(event, &size); LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.isValid()); LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001); EXPECT_TRUE(logEvent.parseBuffer(buf, size)); EXPECT_EQ(100, logEvent.GetTagId()); EXPECT_EQ(1000, logEvent.GetUid()); EXPECT_EQ(1001, logEvent.GetPid()); Loading