void *LogTimeEntry::threadStart(void *obj) { prctl(PR_SET_NAME, "logd.reader.per"); LogTimeEntry *me = reinterpret_cast<LogTimeEntry *>(obj); pthread_cleanup_push(threadStop, obj); SocketClient *client = me->mClient; if (!client) { me->error(); pthread_exit(NULL); } LogBuffer &logbuf = me->mReader.logbuf(); bool privileged = FlushCommand::hasReadLogs(client); lock(); me->threadTriggered = true; while(me->threadTriggered && !me->isError_Locked()) { me->threadTriggered = false; log_time start = me->mStart; unlock(); if (me->mTail) { logbuf.flushTo(client, start, privileged, FilterFirstPass, me); } start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me); if (start == LogBufferElement::FLUSH_ERROR) { me->error(); } if (me->mNonBlock) { lock(); break; } sched_yield(); lock(); } unlock(); pthread_exit(NULL); pthread_cleanup_pop(true); return NULL; }
void *LogTimeEntry::threadStart(void *obj) { prctl(PR_SET_NAME, "logd.reader.per"); LogTimeEntry *me = reinterpret_cast<LogTimeEntry *>(obj); pthread_cleanup_push(threadStop, obj); SocketClient *client = me->mClient; if (!client) { me->error(); return NULL; } LogBuffer &logbuf = me->mReader.logbuf(); bool privileged = FlushCommand::hasReadLogs(client); lock(); while (me->threadRunning && !me->isError_Locked()) { uint64_t start = me->mStart; unlock(); if (me->mTail) { logbuf.flushTo(client, start, privileged, FilterFirstPass, me); } start = logbuf.flushTo(client, start, privileged, FilterSecondPass, me); lock(); if (start == LogBufferElement::FLUSH_ERROR) { me->error_Locked(); } if (me->mNonBlock || !me->threadRunning || me->isError_Locked()) { break; } me->cleanSkip_Locked(); pthread_cond_wait(&me->threadTriggeredCondition, ×Lock); } unlock(); pthread_cleanup_pop(true); return NULL; }