diff options
author | Mark Salyzyn <salyzyn@google.com> | 2014-08-07 08:16:52 -0700 |
---|---|---|
committer | Mark Salyzyn <salyzyn@google.com> | 2014-08-12 18:59:35 +0000 |
commit | a16f761faa258415b521aa6c9376c58d6c865529 (patch) | |
tree | 7ddce79b1cd7fb66862d35f068a669fb4cc565bd /logd | |
parent | 8750fa76090ee735677022f5e2d73419dd7faa93 (diff) | |
download | system_core-a16f761faa258415b521aa6c9376c58d6c865529.zip system_core-a16f761faa258415b521aa6c9376c58d6c865529.tar.gz system_core-a16f761faa258415b521aa6c9376c58d6c865529.tar.bz2 |
logd: persistent reader threads
(cherry picked from commit c113c5813ebd620e0bc60ece9a32ea14c08ea237)
Bug: 16822776
Change-Id: I5bea468a41089b51108880044f32e2b2df1278e7
Diffstat (limited to 'logd')
-rw-r--r-- | logd/LogTimes.cpp | 29 | ||||
-rw-r--r-- | logd/LogTimes.h | 10 |
2 files changed, 18 insertions, 21 deletions
diff --git a/logd/LogTimes.cpp b/logd/LogTimes.cpp index e7e3ec2..ea4e8c8 100644 --- a/logd/LogTimes.cpp +++ b/logd/LogTimes.cpp @@ -33,7 +33,6 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, , mRelease(false) , mError(false) , threadRunning(false) - , threadTriggered(true) , mReader(reader) , mLogMask(logMask) , mPid(pid) @@ -45,7 +44,9 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client, , mStart(start) , mNonBlock(nonBlock) , mEnd(CLOCK_MONOTONIC) -{ } +{ + pthread_cond_init(&threadTriggeredCondition, NULL); +} void LogTimeEntry::startReader_Locked(void) { pthread_attr_t attr; @@ -74,7 +75,6 @@ void LogTimeEntry::threadStop(void *obj) { lock(); - me->threadRunning = false; if (me->mNonBlock) { me->error_Locked(); } @@ -103,6 +103,7 @@ void LogTimeEntry::threadStop(void *obj) { client->decRef(); } + me->threadRunning = false; me->decRef_Locked(); unlock(); @@ -118,7 +119,7 @@ void *LogTimeEntry::threadStart(void *obj) { SocketClient *client = me->mClient; if (!client) { me->error(); - pthread_exit(NULL); + return NULL; } LogBuffer &logbuf = me->mReader.logbuf(); @@ -127,12 +128,7 @@ void *LogTimeEntry::threadStart(void *obj) { lock(); - me->threadTriggered = true; - - while(me->threadTriggered && !me->isError_Locked()) { - - me->threadTriggered = false; - + while (me->threadRunning && !me->isError_Locked()) { log_time start = me->mStart; unlock(); @@ -142,24 +138,21 @@ void *LogTimeEntry::threadStart(void *obj) { } start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me); + lock(); + if (start == LogBufferElement::FLUSH_ERROR) { - me->error(); + me->error_Locked(); } - if (me->mNonBlock) { - lock(); + if (me->mNonBlock || !me->threadRunning || me->isError_Locked()) { break; } - sched_yield(); - - lock(); + pthread_cond_wait(&me->threadTriggeredCondition, ×Lock); } unlock(); - pthread_exit(NULL); - pthread_cleanup_pop(true); return NULL; diff --git a/logd/LogTimes.h b/logd/LogTimes.h index beaf646..0bfa7a2 100644 --- a/logd/LogTimes.h +++ b/logd/LogTimes.h @@ -31,7 +31,7 @@ class LogTimeEntry { bool mRelease; bool mError; bool threadRunning; - bool threadTriggered; + pthread_cond_t threadTriggeredCondition; pthread_t mThread; LogReader &mReader; static void *threadStart(void *me); @@ -63,12 +63,16 @@ public: bool runningReader_Locked(void) const { return threadRunning || mRelease || mError || mNonBlock; } - void triggerReader_Locked(void) { threadTriggered = true; } + void triggerReader_Locked(void) { + pthread_cond_signal(&threadTriggeredCondition); + } + void triggerSkip_Locked(unsigned int skip) { skipAhead = skip; } // Called after LogTimeEntry removed from list, lock implicitly held void release_Locked(void) { mRelease = true; + pthread_cond_signal(&threadTriggeredCondition); if (mRefCount || threadRunning) { return; } @@ -78,7 +82,7 @@ public: // Called to mark socket in jeopardy void error_Locked(void) { mError = true; } - void error(void) { lock(); mError = true; unlock(); } + void error(void) { lock(); error_Locked(); unlock(); } bool isError_Locked(void) const { return mRelease || mError; } |