diff options
author | Christopher Ferris | 2017-08-15 12:15:02 -0500 |
---|---|---|
committer | android-build-merger | 2017-08-15 12:15:02 -0500 |
commit | 9e87cb031d675a55a18bedad85fcc6a1fc67649b (patch) | |
tree | c53efe72601081c0e6811cadda6b7214e7022bbd /logd | |
parent | 13a3a0d30fea3db5383d9fb6259ab58dbe30c573 (diff) | |
parent | 784d6626fbbe77c7635177854c4b8850fc8a89ec (diff) | |
download | platform-system-core-9e87cb031d675a55a18bedad85fcc6a1fc67649b.tar.gz platform-system-core-9e87cb031d675a55a18bedad85fcc6a1fc67649b.tar.xz platform-system-core-9e87cb031d675a55a18bedad85fcc6a1fc67649b.zip |
Merge "Decrease size of LogBufferElements to 32 bytes." am: 44ad937411 am: e23b30a6da am: 90c25cbdd3
am: 784d6626fb
Change-Id: I39013185503abfc5872c4746f0d6e0461e5d8b7b
Diffstat (limited to 'logd')
-rw-r--r-- | logd/LogBufferElement.cpp | 48 | ||||
-rw-r--r-- | logd/LogBufferElement.h | 30 |
2 files changed, 47 insertions, 31 deletions
diff --git a/logd/LogBufferElement.cpp b/logd/LogBufferElement.cpp index 381c97457..f20ac4514 100644 --- a/logd/LogBufferElement.cpp +++ b/logd/LogBufferElement.cpp | |||
@@ -41,22 +41,20 @@ LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime, | |||
41 | mTid(tid), | 41 | mTid(tid), |
42 | mRealTime(realtime), | 42 | mRealTime(realtime), |
43 | mMsgLen(len), | 43 | mMsgLen(len), |
44 | mLogId(log_id) { | 44 | mLogId(log_id), |
45 | mDropped(false) { | ||
45 | mMsg = new char[len]; | 46 | mMsg = new char[len]; |
46 | memcpy(mMsg, msg, len); | 47 | memcpy(mMsg, msg, len); |
47 | mTag = (isBinary() && (mMsgLen >= sizeof(uint32_t))) | ||
48 | ? le32toh(reinterpret_cast<android_event_header_t*>(mMsg)->tag) | ||
49 | : 0; | ||
50 | } | 48 | } |
51 | 49 | ||
52 | LogBufferElement::LogBufferElement(const LogBufferElement& elem) | 50 | LogBufferElement::LogBufferElement(const LogBufferElement& elem) |
53 | : mTag(elem.mTag), | 51 | : mUid(elem.mUid), |
54 | mUid(elem.mUid), | ||
55 | mPid(elem.mPid), | 52 | mPid(elem.mPid), |
56 | mTid(elem.mTid), | 53 | mTid(elem.mTid), |
57 | mRealTime(elem.mRealTime), | 54 | mRealTime(elem.mRealTime), |
58 | mMsgLen(elem.mMsgLen), | 55 | mMsgLen(elem.mMsgLen), |
59 | mLogId(elem.mLogId) { | 56 | mLogId(elem.mLogId), |
57 | mDropped(elem.mDropped) { | ||
60 | mMsg = new char[mMsgLen]; | 58 | mMsg = new char[mMsgLen]; |
61 | memcpy(mMsg, elem.mMsg, mMsgLen); | 59 | memcpy(mMsg, elem.mMsg, mMsgLen); |
62 | } | 60 | } |
@@ -65,6 +63,32 @@ LogBufferElement::~LogBufferElement() { | |||
65 | delete[] mMsg; | 63 | delete[] mMsg; |
66 | } | 64 | } |
67 | 65 | ||
66 | uint32_t LogBufferElement::getTag() const { | ||
67 | return (isBinary() && | ||
68 | ((mDropped && mMsg != nullptr) || | ||
69 | (!mDropped && mMsgLen >= sizeof(android_event_header_t)))) | ||
70 | ? reinterpret_cast<const android_event_header_t*>(mMsg)->tag | ||
71 | : 0; | ||
72 | } | ||
73 | |||
74 | unsigned short LogBufferElement::setDropped(unsigned short value) { | ||
75 | // The tag information is saved in mMsg data, if the tag is non-zero | ||
76 | // save only the information needed to get the tag. | ||
77 | if (getTag() != 0) { | ||
78 | if (mMsgLen > sizeof(android_event_header_t)) { | ||
79 | char* truncated_msg = new char[sizeof(android_event_header_t)]; | ||
80 | memcpy(truncated_msg, mMsg, sizeof(android_event_header_t)); | ||
81 | delete[] mMsg; | ||
82 | mMsg = truncated_msg; | ||
83 | } // mMsgLen == sizeof(android_event_header_t), already at minimum. | ||
84 | } else { | ||
85 | delete[] mMsg; | ||
86 | mMsg = nullptr; | ||
87 | } | ||
88 | mDropped = true; | ||
89 | return mDroppedCount = value; | ||
90 | } | ||
91 | |||
68 | // caller must own and free character string | 92 | // caller must own and free character string |
69 | char* android::tidToName(pid_t tid) { | 93 | char* android::tidToName(pid_t tid) { |
70 | char* retval = NULL; | 94 | char* retval = NULL; |
@@ -164,8 +188,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent | |||
164 | // identical to below to calculate the buffer size required | 188 | // identical to below to calculate the buffer size required |
165 | const char* type = lastSame ? "identical" : "expire"; | 189 | const char* type = lastSame ? "identical" : "expire"; |
166 | size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", | 190 | size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "", |
167 | commName ? commName : "", type, mDropped, | 191 | commName ? commName : "", type, getDropped(), |
168 | (mDropped > 1) ? "s" : ""); | 192 | (getDropped() > 1) ? "s" : ""); |
169 | 193 | ||
170 | size_t hdrLen; | 194 | size_t hdrLen; |
171 | if (isBinary()) { | 195 | if (isBinary()) { |
@@ -196,8 +220,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent | |||
196 | } | 220 | } |
197 | 221 | ||
198 | snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", | 222 | snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "", |
199 | commName ? commName : "", type, mDropped, | 223 | commName ? commName : "", type, getDropped(), |
200 | (mDropped > 1) ? "s" : ""); | 224 | (getDropped() > 1) ? "s" : ""); |
201 | free(const_cast<char*>(name)); | 225 | free(const_cast<char*>(name)); |
202 | free(const_cast<char*>(commName)); | 226 | free(const_cast<char*>(commName)); |
203 | 227 | ||
@@ -225,7 +249,7 @@ log_time LogBufferElement::flushTo(SocketClient* reader, LogBuffer* parent, | |||
225 | 249 | ||
226 | char* buffer = NULL; | 250 | char* buffer = NULL; |
227 | 251 | ||
228 | if (!mMsg) { | 252 | if (mDropped) { |
229 | entry.len = populateDroppedMessage(buffer, parent, lastSame); | 253 | entry.len = populateDroppedMessage(buffer, parent, lastSame); |
230 | if (!entry.len) return mRealTime; | 254 | if (!entry.len) return mRealTime; |
231 | iovec[1].iov_base = buffer; | 255 | iovec[1].iov_base = buffer; |
diff --git a/logd/LogBufferElement.h b/logd/LogBufferElement.h index 814ec8785..b168645f1 100644 --- a/logd/LogBufferElement.h +++ b/logd/LogBufferElement.h | |||
@@ -32,25 +32,25 @@ class LogBuffer; | |||
32 | // chatty for the temporal expire messages | 32 | // chatty for the temporal expire messages |
33 | #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration | 33 | #define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration |
34 | 34 | ||
35 | class LogBufferElement { | 35 | class __attribute__((packed)) LogBufferElement { |
36 | friend LogBuffer; | 36 | friend LogBuffer; |
37 | 37 | ||
38 | // sized to match reality of incoming log packets | 38 | // sized to match reality of incoming log packets |
39 | uint32_t mTag; // only valid for isBinary() | ||
40 | const uint32_t mUid; | 39 | const uint32_t mUid; |
41 | const uint32_t mPid; | 40 | const uint32_t mPid; |
42 | const uint32_t mTid; | 41 | const uint32_t mTid; |
43 | log_time mRealTime; | 42 | log_time mRealTime; |
44 | char* mMsg; | 43 | char* mMsg; |
45 | union { | 44 | union { |
46 | const uint16_t mMsgLen; // mMSg != NULL | 45 | const uint16_t mMsgLen; // mDropped == false |
47 | uint16_t mDropped; // mMsg == NULL | 46 | uint16_t mDroppedCount; // mDropped == true |
48 | }; | 47 | }; |
49 | const uint8_t mLogId; | 48 | const uint8_t mLogId; |
49 | bool mDropped; | ||
50 | 50 | ||
51 | static atomic_int_fast64_t sequence; | 51 | static atomic_int_fast64_t sequence; |
52 | 52 | ||
53 | // assumption: mMsg == NULL | 53 | // assumption: mDropped == true |
54 | size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, | 54 | size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, |
55 | bool lastSame); | 55 | bool lastSame); |
56 | 56 | ||
@@ -58,7 +58,7 @@ class LogBufferElement { | |||
58 | LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, | 58 | LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, |
59 | pid_t tid, const char* msg, unsigned short len); | 59 | pid_t tid, const char* msg, unsigned short len); |
60 | LogBufferElement(const LogBufferElement& elem); | 60 | LogBufferElement(const LogBufferElement& elem); |
61 | virtual ~LogBufferElement(); | 61 | ~LogBufferElement(); |
62 | 62 | ||
63 | bool isBinary(void) const { | 63 | bool isBinary(void) const { |
64 | return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); | 64 | return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); |
@@ -76,24 +76,16 @@ class LogBufferElement { | |||
76 | pid_t getTid(void) const { | 76 | pid_t getTid(void) const { |
77 | return mTid; | 77 | return mTid; |
78 | } | 78 | } |
79 | uint32_t getTag() const { | 79 | uint32_t getTag() const; |
80 | return mTag; | ||
81 | } | ||
82 | unsigned short getDropped(void) const { | 80 | unsigned short getDropped(void) const { |
83 | return mMsg ? 0 : mDropped; | 81 | return mDropped ? mDroppedCount : 0; |
84 | } | ||
85 | unsigned short setDropped(unsigned short value) { | ||
86 | if (mMsg) { | ||
87 | delete[] mMsg; | ||
88 | mMsg = NULL; | ||
89 | } | ||
90 | return mDropped = value; | ||
91 | } | 82 | } |
83 | unsigned short setDropped(unsigned short value); | ||
92 | unsigned short getMsgLen() const { | 84 | unsigned short getMsgLen() const { |
93 | return mMsg ? mMsgLen : 0; | 85 | return mDropped ? 0 : mMsgLen; |
94 | } | 86 | } |
95 | const char* getMsg() const { | 87 | const char* getMsg() const { |
96 | return mMsg; | 88 | return mDropped ? nullptr : mMsg; |
97 | } | 89 | } |
98 | log_time getRealTime(void) const { | 90 | log_time getRealTime(void) const { |
99 | return mRealTime; | 91 | return mRealTime; |