diff options
Diffstat (limited to 'logd/LogTimes.cpp')
-rw-r--r-- | logd/LogTimes.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/logd/LogTimes.cpp b/logd/LogTimes.cpp index 229be3cd5..b4c97a985 100644 --- a/logd/LogTimes.cpp +++ b/logd/LogTimes.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <errno.h> #include <sys/prctl.h> #include "FlushCommand.h" @@ -26,7 +27,7 @@ pthread_mutex_t LogTimeEntry::timesLock = PTHREAD_MUTEX_INITIALIZER; LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, bool nonBlock, unsigned long tail, unsigned int logMask, pid_t pid, - uint64_t start) : + uint64_t start, uint64_t timeout) : mRefCount(1), mRelease(false), mError(false), @@ -42,6 +43,8 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, mStart(start), mNonBlock(nonBlock), mEnd(LogBufferElement::getCurrentSequence()) { + mTimeout.tv_sec = timeout / NS_PER_SEC; + mTimeout.tv_nsec = timeout % NS_PER_SEC; pthread_cond_init(&threadTriggeredCondition, NULL); cleanSkip_Locked(); } @@ -131,6 +134,19 @@ void *LogTimeEntry::threadStart(void *obj) { uint64_t start = me->mStart; while (me->threadRunning && !me->isError_Locked()) { + + if (me->mTimeout.tv_sec || me->mTimeout.tv_nsec) { + if (pthread_cond_timedwait(&me->threadTriggeredCondition, + ×Lock, + &me->mTimeout) == ETIMEDOUT) { + me->mTimeout.tv_sec = 0; + me->mTimeout.tv_nsec = 0; + } + if (!me->threadRunning || me->isError_Locked()) { + break; + } + } + unlock(); if (me->mTail) { @@ -154,7 +170,9 @@ void *LogTimeEntry::threadStart(void *obj) { me->cleanSkip_Locked(); - pthread_cond_wait(&me->threadTriggeredCondition, ×Lock); + if (!me->mTimeout.tv_sec && !me->mTimeout.tv_nsec) { + pthread_cond_wait(&me->threadTriggeredCondition, ×Lock); + } } unlock(); |