Merge "logd: persistent reader threads"

This commit is contained in:
Mark Salyzyn 2014-08-12 19:00:00 +00:00 committed by Gerrit Code Review
commit d8ab8fc71c
2 changed files with 18 additions and 21 deletions

View file

@ -33,7 +33,6 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client,
, mRelease(false) , mRelease(false)
, mError(false) , mError(false)
, threadRunning(false) , threadRunning(false)
, threadTriggered(true)
, mReader(reader) , mReader(reader)
, mLogMask(logMask) , mLogMask(logMask)
, mPid(pid) , mPid(pid)
@ -45,7 +44,9 @@ LogTimeEntry::LogTimeEntry(LogReader &reader, SocketClient *client,
, mStart(start) , mStart(start)
, mNonBlock(nonBlock) , mNonBlock(nonBlock)
, mEnd(CLOCK_MONOTONIC) , mEnd(CLOCK_MONOTONIC)
{ } {
pthread_cond_init(&threadTriggeredCondition, NULL);
}
void LogTimeEntry::startReader_Locked(void) { void LogTimeEntry::startReader_Locked(void) {
pthread_attr_t attr; pthread_attr_t attr;
@ -74,7 +75,6 @@ void LogTimeEntry::threadStop(void *obj) {
lock(); lock();
me->threadRunning = false;
if (me->mNonBlock) { if (me->mNonBlock) {
me->error_Locked(); me->error_Locked();
} }
@ -103,6 +103,7 @@ void LogTimeEntry::threadStop(void *obj) {
client->decRef(); client->decRef();
} }
me->threadRunning = false;
me->decRef_Locked(); me->decRef_Locked();
unlock(); unlock();
@ -118,7 +119,7 @@ void *LogTimeEntry::threadStart(void *obj) {
SocketClient *client = me->mClient; SocketClient *client = me->mClient;
if (!client) { if (!client) {
me->error(); me->error();
pthread_exit(NULL); return NULL;
} }
LogBuffer &logbuf = me->mReader.logbuf(); LogBuffer &logbuf = me->mReader.logbuf();
@ -127,12 +128,7 @@ void *LogTimeEntry::threadStart(void *obj) {
lock(); lock();
me->threadTriggered = true; while (me->threadRunning && !me->isError_Locked()) {
while(me->threadTriggered && !me->isError_Locked()) {
me->threadTriggered = false;
log_time start = me->mStart; log_time start = me->mStart;
unlock(); unlock();
@ -142,24 +138,21 @@ void *LogTimeEntry::threadStart(void *obj) {
} }
start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me); start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me);
lock();
if (start == LogBufferElement::FLUSH_ERROR) { if (start == LogBufferElement::FLUSH_ERROR) {
me->error(); me->error_Locked();
} }
if (me->mNonBlock) { if (me->mNonBlock || !me->threadRunning || me->isError_Locked()) {
lock();
break; break;
} }
sched_yield(); pthread_cond_wait(&me->threadTriggeredCondition, &timesLock);
lock();
} }
unlock(); unlock();
pthread_exit(NULL);
pthread_cleanup_pop(true); pthread_cleanup_pop(true);
return NULL; return NULL;

View file

@ -31,7 +31,7 @@ class LogTimeEntry {
bool mRelease; bool mRelease;
bool mError; bool mError;
bool threadRunning; bool threadRunning;
bool threadTriggered; pthread_cond_t threadTriggeredCondition;
pthread_t mThread; pthread_t mThread;
LogReader &mReader; LogReader &mReader;
static void *threadStart(void *me); static void *threadStart(void *me);
@ -63,12 +63,16 @@ public:
bool runningReader_Locked(void) const { bool runningReader_Locked(void) const {
return threadRunning || mRelease || mError || mNonBlock; 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; } void triggerSkip_Locked(unsigned int skip) { skipAhead = skip; }
// Called after LogTimeEntry removed from list, lock implicitly held // Called after LogTimeEntry removed from list, lock implicitly held
void release_Locked(void) { void release_Locked(void) {
mRelease = true; mRelease = true;
pthread_cond_signal(&threadTriggeredCondition);
if (mRefCount || threadRunning) { if (mRefCount || threadRunning) {
return; return;
} }
@ -78,7 +82,7 @@ public:
// Called to mark socket in jeopardy // Called to mark socket in jeopardy
void error_Locked(void) { mError = true; } 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; } bool isError_Locked(void) const { return mRelease || mError; }