summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorChristopher Ferris2017-08-15 12:15:02 -0500
committerandroid-build-merger2017-08-15 12:15:02 -0500
commit9e87cb031d675a55a18bedad85fcc6a1fc67649b (patch)
treec53efe72601081c0e6811cadda6b7214e7022bbd /logd
parent13a3a0d30fea3db5383d9fb6259ab58dbe30c573 (diff)
parent784d6626fbbe77c7635177854c4b8850fc8a89ec (diff)
downloadplatform-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.cpp48
-rw-r--r--logd/LogBufferElement.h30
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
52LogBufferElement::LogBufferElement(const LogBufferElement& elem) 50LogBufferElement::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
66uint32_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
74unsigned 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
69char* android::tidToName(pid_t tid) { 93char* 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
35class LogBufferElement { 35class __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;