diff options
Diffstat (limited to 'logd/LogTimes.cpp')
-rw-r--r-- | logd/LogTimes.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/logd/LogTimes.cpp b/logd/LogTimes.cpp index ea4e8c8..1b60b7e 100644 --- a/logd/LogTimes.cpp +++ b/logd/LogTimes.cpp @@ -23,12 +23,10 @@ pthread_mutex_t LogTimeEntry::timesLock = PTHREAD_MUTEX_INITIALIZER; -const struct timespec LogTimeEntry::EPOCH = { 0, 1 }; - LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, bool nonBlock, unsigned long tail, unsigned int logMask, pid_t pid, - log_time start) + uint64_t start) : mRefCount(1) , mRelease(false) , mError(false) @@ -36,16 +34,16 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, , mReader(reader) , mLogMask(logMask) , mPid(pid) - , skipAhead(0) , mCount(0) , mTail(tail) , mIndex(0) , mClient(client) , mStart(start) , mNonBlock(nonBlock) - , mEnd(CLOCK_MONOTONIC) + , mEnd(LogBufferElement::getCurrentSequence()) { pthread_cond_init(&threadTriggeredCondition, NULL); + cleanSkip_Locked(); } void LogTimeEntry::startReader_Locked(void) { @@ -129,7 +127,7 @@ void *LogTimeEntry::threadStart(void *obj) { lock(); while (me->threadRunning && !me->isError_Locked()) { - log_time start = me->mStart; + uint64_t start = me->mStart; unlock(); @@ -148,6 +146,8 @@ void *LogTimeEntry::threadStart(void *obj) { break; } + me->cleanSkip_Locked(); + pthread_cond_wait(&me->threadTriggeredCondition, ×Lock); } @@ -159,17 +159,17 @@ void *LogTimeEntry::threadStart(void *obj) { } // A first pass to count the number of elements -bool LogTimeEntry::FilterFirstPass(const LogBufferElement *element, void *obj) { +int LogTimeEntry::FilterFirstPass(const LogBufferElement *element, void *obj) { LogTimeEntry *me = reinterpret_cast<LogTimeEntry *>(obj); LogTimeEntry::lock(); if (me->mCount == 0) { - me->mStart = element->getMonotonicTime(); + me->mStart = element->getSequence(); } if ((!me->mPid || (me->mPid == element->getPid())) - && (me->mLogMask & (1 << element->getLogId()))) { + && (me->isWatching(element->getLogId()))) { ++me->mCount; } @@ -179,24 +179,24 @@ bool LogTimeEntry::FilterFirstPass(const LogBufferElement *element, void *obj) { } // A second pass to send the selected elements -bool LogTimeEntry::FilterSecondPass(const LogBufferElement *element, void *obj) { +int LogTimeEntry::FilterSecondPass(const LogBufferElement *element, void *obj) { LogTimeEntry *me = reinterpret_cast<LogTimeEntry *>(obj); LogTimeEntry::lock(); - if (me->skipAhead) { - me->skipAhead--; + me->mStart = element->getSequence(); + + if (me->skipAhead[element->getLogId()]) { + me->skipAhead[element->getLogId()]--; goto skip; } - me->mStart = element->getMonotonicTime(); - // Truncate to close race between first and second pass if (me->mNonBlock && me->mTail && (me->mIndex >= me->mCount)) { - goto skip; + goto stop; } - if ((me->mLogMask & (1 << element->getLogId())) == 0) { + if (!me->isWatching(element->getLogId())) { goto skip; } @@ -205,7 +205,7 @@ bool LogTimeEntry::FilterSecondPass(const LogBufferElement *element, void *obj) } if (me->isError_Locked()) { - goto skip; + goto stop; } if (!me->mTail) { @@ -223,7 +223,7 @@ bool LogTimeEntry::FilterSecondPass(const LogBufferElement *element, void *obj) } ok: - if (!me->skipAhead) { + if (!me->skipAhead[element->getLogId()]) { LogTimeEntry::unlock(); return true; } @@ -232,4 +232,14 @@ ok: skip: LogTimeEntry::unlock(); return false; + +stop: + LogTimeEntry::unlock(); + return -1; +} + +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; + } } |