Merge changes I0c3887f2,I8fc585bb into oc-dev
* changes: logd: correctly label identical lines logd: strip out empty trailing iovec
This commit is contained in:
commit
e98f1a9c56
6 changed files with 51 additions and 42 deletions
|
@ -109,11 +109,11 @@ void LogBuffer::init() {
|
|||
|
||||
LogBuffer::LogBuffer(LastLogTimes* times)
|
||||
: monotonic(android_log_clockid() == CLOCK_MONOTONIC), mTimes(*times) {
|
||||
pthread_mutex_init(&mLogElementsLock, NULL);
|
||||
pthread_mutex_init(&mLogElementsLock, nullptr);
|
||||
|
||||
log_id_for_each(i) {
|
||||
lastLoggedElements[i] = NULL;
|
||||
droppedElements[i] = NULL;
|
||||
lastLoggedElements[i] = nullptr;
|
||||
droppedElements[i] = nullptr;
|
||||
}
|
||||
|
||||
init();
|
||||
|
@ -198,7 +198,7 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
|
|||
new LogBufferElement(log_id, realtime, uid, pid, tid, msg, len);
|
||||
if (log_id != LOG_ID_SECURITY) {
|
||||
int prio = ANDROID_LOG_INFO;
|
||||
const char* tag = NULL;
|
||||
const char* tag = nullptr;
|
||||
if (log_id == LOG_ID_EVENTS) {
|
||||
tag = tagToName(elem->getTag());
|
||||
} else {
|
||||
|
@ -224,24 +224,24 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
|
|||
//
|
||||
// State Init
|
||||
// incoming:
|
||||
// dropped = NULL
|
||||
// currentLast = NULL;
|
||||
// dropped = nullptr
|
||||
// currentLast = nullptr;
|
||||
// elem = incoming message
|
||||
// outgoing:
|
||||
// dropped = NULL -> State 0
|
||||
// dropped = nullptr -> State 0
|
||||
// currentLast = copy of elem
|
||||
// log elem
|
||||
// State 0
|
||||
// incoming:
|
||||
// count = 0
|
||||
// dropped = NULL
|
||||
// dropped = nullptr
|
||||
// currentLast = copy of last message
|
||||
// elem = incoming message
|
||||
// outgoing: if match != DIFFERENT
|
||||
// dropped = copy of first identical message -> State 1
|
||||
// currentLast = reference to elem
|
||||
// break: if match == DIFFERENT
|
||||
// dropped = NULL -> State 0
|
||||
// dropped = nullptr -> State 0
|
||||
// delete copy of last message (incoming currentLast)
|
||||
// currentLast = copy of elem
|
||||
// log elem
|
||||
|
@ -268,7 +268,7 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
|
|||
// currentLast = reference to elem, sum liblog.
|
||||
// break: if match == DIFFERENT
|
||||
// delete dropped
|
||||
// dropped = NULL -> State 0
|
||||
// dropped = nullptr -> State 0
|
||||
// log reference to last held-back (currentLast)
|
||||
// currentLast = copy of elem
|
||||
// log elem
|
||||
|
@ -287,7 +287,7 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
|
|||
// currentLast = reference to elem
|
||||
// break: if match == DIFFERENT
|
||||
// log dropped (chatty message)
|
||||
// dropped = NULL -> State 0
|
||||
// dropped = nullptr -> State 0
|
||||
// log reference to last held-back (currentLast)
|
||||
// currentLast = copy of elem
|
||||
// log elem
|
||||
|
@ -352,7 +352,7 @@ int LogBuffer::log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
|
|||
} else { // State 1
|
||||
delete dropped;
|
||||
}
|
||||
droppedElements[log_id] = NULL;
|
||||
droppedElements[log_id] = nullptr;
|
||||
log(currentLast); // report last message in the series
|
||||
} else { // State 0
|
||||
delete currentLast;
|
||||
|
@ -656,7 +656,7 @@ class LogBufferElementLast {
|
|||
// mLogElementsLock must be held when this function is called.
|
||||
//
|
||||
bool LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) {
|
||||
LogTimeEntry* oldest = NULL;
|
||||
LogTimeEntry* oldest = nullptr;
|
||||
bool busy = false;
|
||||
bool clearAll = pruneRows == ULONG_MAX;
|
||||
|
||||
|
@ -1078,9 +1078,11 @@ unsigned long LogBuffer::getSize(log_id_t id) {
|
|||
return retval;
|
||||
}
|
||||
|
||||
log_time LogBuffer::flushTo(
|
||||
SocketClient* reader, const log_time& start, bool privileged, bool security,
|
||||
int (*filter)(const LogBufferElement* element, void* arg), void* arg) {
|
||||
log_time LogBuffer::flushTo(SocketClient* reader, const log_time& start,
|
||||
pid_t* lastTid, bool privileged, bool security,
|
||||
int (*filter)(const LogBufferElement* element,
|
||||
void* arg),
|
||||
void* arg) {
|
||||
LogBufferElementCollection::iterator it;
|
||||
uid_t uid = reader->getUid();
|
||||
|
||||
|
@ -1109,9 +1111,6 @@ log_time LogBuffer::flushTo(
|
|||
}
|
||||
|
||||
log_time max = start;
|
||||
// Help detect if the valid message before is from the same source so
|
||||
// we can differentiate chatty filter types.
|
||||
pid_t lastTid[LOG_ID_MAX] = { 0 };
|
||||
|
||||
for (; it != mLogElements.end(); ++it) {
|
||||
LogBufferElement* element = *it;
|
||||
|
@ -1139,14 +1138,17 @@ log_time LogBuffer::flushTo(
|
|||
}
|
||||
}
|
||||
|
||||
bool sameTid = lastTid[element->getLogId()] == element->getTid();
|
||||
// Dropped (chatty) immediately following a valid log from the
|
||||
// same source in the same log buffer indicates we have a
|
||||
// multiple identical squash. chatty that differs source
|
||||
// is due to spam filter. chatty to chatty of different
|
||||
// source is also due to spam filter.
|
||||
lastTid[element->getLogId()] =
|
||||
(element->getDropped() && !sameTid) ? 0 : element->getTid();
|
||||
bool sameTid = false;
|
||||
if (lastTid) {
|
||||
sameTid = lastTid[element->getLogId()] == element->getTid();
|
||||
// Dropped (chatty) immediately following a valid log from the
|
||||
// same source in the same log buffer indicates we have a
|
||||
// multiple identical squash. chatty that differs source
|
||||
// is due to spam filter. chatty to chatty of different
|
||||
// source is also due to spam filter.
|
||||
lastTid[element->getLogId()] =
|
||||
(element->getDropped() && !sameTid) ? 0 : element->getTid();
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&mLogElementsLock);
|
||||
|
||||
|
|
|
@ -115,11 +115,15 @@ class LogBuffer {
|
|||
|
||||
int log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid,
|
||||
const char* msg, unsigned short len);
|
||||
// lastTid is an optional context to help detect if the last previous
|
||||
// valid message was from the same source so we can differentiate chatty
|
||||
// filter types (identical or expired)
|
||||
log_time flushTo(SocketClient* writer, const log_time& start,
|
||||
pid_t* lastTid, // &lastTid[LOG_ID_MAX] or nullptr
|
||||
bool privileged, bool security,
|
||||
int (*filter)(const LogBufferElement* element,
|
||||
void* arg) = NULL,
|
||||
void* arg = NULL);
|
||||
void* arg) = nullptr,
|
||||
void* arg = nullptr);
|
||||
|
||||
bool clear(log_id_t id, uid_t uid = AID_ROOT);
|
||||
unsigned long getSize(log_id_t id);
|
||||
|
|
|
@ -235,7 +235,9 @@ log_time LogBufferElement::flushTo(SocketClient* reader, LogBuffer* parent,
|
|||
}
|
||||
iovec[1].iov_len = entry.len;
|
||||
|
||||
log_time retval = reader->sendDatav(iovec, 2) ? FLUSH_ERROR : mRealTime;
|
||||
log_time retval = reader->sendDatav(iovec, 1 + (entry.len != 0))
|
||||
? FLUSH_ERROR
|
||||
: mRealTime;
|
||||
|
||||
if (buffer) free(buffer);
|
||||
|
||||
|
|
|
@ -182,7 +182,7 @@ bool LogReader::onDataAvailable(SocketClient* cli) {
|
|||
} logFindStart(pid, logMask, sequence,
|
||||
logbuf().isMonotonic() && android::isMonotonic(start));
|
||||
|
||||
logbuf().flushTo(cli, sequence, FlushCommand::hasReadLogs(cli),
|
||||
logbuf().flushTo(cli, sequence, nullptr, FlushCommand::hasReadLogs(cli),
|
||||
FlushCommand::hasSecurityLogs(cli),
|
||||
logFindStart.callback, &logFindStart);
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/prctl.h>
|
||||
|
||||
#include <private/android_logger.h>
|
||||
|
@ -47,7 +48,8 @@ LogTimeEntry::LogTimeEntry(LogReader& reader, SocketClient* client,
|
|||
mEnd(log_time(android_log_clockid())) {
|
||||
mTimeout.tv_sec = timeout / NS_PER_SEC;
|
||||
mTimeout.tv_nsec = timeout % NS_PER_SEC;
|
||||
pthread_cond_init(&threadTriggeredCondition, NULL);
|
||||
memset(mLastTid, 0, sizeof(mLastTid));
|
||||
pthread_cond_init(&threadTriggeredCondition, nullptr);
|
||||
cleanSkip_Locked();
|
||||
}
|
||||
|
||||
|
@ -98,7 +100,7 @@ void LogTimeEntry::threadStop(void* obj) {
|
|||
it++;
|
||||
}
|
||||
|
||||
me->mClient = NULL;
|
||||
me->mClient = nullptr;
|
||||
reader.release(client);
|
||||
}
|
||||
|
||||
|
@ -122,7 +124,7 @@ void* LogTimeEntry::threadStart(void* obj) {
|
|||
SocketClient* client = me->mClient;
|
||||
if (!client) {
|
||||
me->error();
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LogBuffer& logbuf = me->mReader.logbuf();
|
||||
|
@ -151,12 +153,12 @@ void* LogTimeEntry::threadStart(void* obj) {
|
|||
unlock();
|
||||
|
||||
if (me->mTail) {
|
||||
logbuf.flushTo(client, start, privileged, security, FilterFirstPass,
|
||||
me);
|
||||
logbuf.flushTo(client, start, nullptr, privileged, security,
|
||||
FilterFirstPass, me);
|
||||
me->leadingDropped = true;
|
||||
}
|
||||
start = logbuf.flushTo(client, start, privileged, security,
|
||||
FilterSecondPass, me);
|
||||
start = logbuf.flushTo(client, start, me->mLastTid, privileged,
|
||||
security, FilterSecondPass, me);
|
||||
|
||||
lock();
|
||||
|
||||
|
@ -182,7 +184,7 @@ void* LogTimeEntry::threadStart(void* obj) {
|
|||
|
||||
pthread_cleanup_pop(true);
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// A first pass to count the number of elements
|
||||
|
@ -281,7 +283,5 @@ stop:
|
|||
}
|
||||
|
||||
void LogTimeEntry::cleanSkip_Locked(void) {
|
||||
for (log_id_t i = LOG_ID_MIN; i < LOG_ID_MAX; i = (log_id_t)(i + 1)) {
|
||||
skipAhead[i] = 0;
|
||||
}
|
||||
memset(skipAhead, 0, sizeof(skipAhead));
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@ class LogTimeEntry {
|
|||
const unsigned int mLogMask;
|
||||
const pid_t mPid;
|
||||
unsigned int skipAhead[LOG_ID_MAX];
|
||||
pid_t mLastTid[LOG_ID_MAX];
|
||||
unsigned long mCount;
|
||||
unsigned long mTail;
|
||||
unsigned long mIndex;
|
||||
|
|
Loading…
Reference in a new issue