10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/*
20175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project
30175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
40175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
50175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * you may not use this file except in compliance with the License.
60175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * You may obtain a copy of the License at
70175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
80175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
90175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn *
100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * See the License for the specific language governing permissions and
140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * limitations under the License.
150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn */
160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
17b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn#include <errno.h>
18ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn#include <string.h>
198daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn#include <sys/prctl.h>
208daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn
215a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn#include <private/android_logger.h>
225a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn
230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "FlushCommand.h"
240175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogBuffer.h"
250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogReader.h"
26501c373916e292764400dbae735f44b33378400fMark Salyzyn#include "LogTimes.h"
270175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
280175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynpthread_mutex_t LogTimeEntry::timesLock = PTHREAD_MUTEX_INITIALIZER;
290175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
30501c373916e292764400dbae735f44b33378400fMark SalyzynLogTimeEntry::LogTimeEntry(LogReader& reader, SocketClient* client,
310175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn                           bool nonBlock, unsigned long tail,
325a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn                           unsigned int logMask, pid_t pid, log_time start,
33501c373916e292764400dbae735f44b33378400fMark Salyzyn                           uint64_t timeout)
34501c373916e292764400dbae735f44b33378400fMark Salyzyn    : mRefCount(1),
35501c373916e292764400dbae735f44b33378400fMark Salyzyn      mRelease(false),
36501c373916e292764400dbae735f44b33378400fMark Salyzyn      mError(false),
37501c373916e292764400dbae735f44b33378400fMark Salyzyn      threadRunning(false),
38501c373916e292764400dbae735f44b33378400fMark Salyzyn      leadingDropped(false),
39501c373916e292764400dbae735f44b33378400fMark Salyzyn      mReader(reader),
40501c373916e292764400dbae735f44b33378400fMark Salyzyn      mLogMask(logMask),
41501c373916e292764400dbae735f44b33378400fMark Salyzyn      mPid(pid),
42501c373916e292764400dbae735f44b33378400fMark Salyzyn      mCount(0),
43501c373916e292764400dbae735f44b33378400fMark Salyzyn      mTail(tail),
44501c373916e292764400dbae735f44b33378400fMark Salyzyn      mIndex(0),
45501c373916e292764400dbae735f44b33378400fMark Salyzyn      mClient(client),
46501c373916e292764400dbae735f44b33378400fMark Salyzyn      mStart(start),
47501c373916e292764400dbae735f44b33378400fMark Salyzyn      mNonBlock(nonBlock),
485a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn      mEnd(log_time(android_log_clockid())) {
49b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn    mTimeout.tv_sec = timeout / NS_PER_SEC;
50b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn    mTimeout.tv_nsec = timeout % NS_PER_SEC;
51ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn    memset(mLastTid, 0, sizeof(mLastTid));
52ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn    pthread_cond_init(&threadTriggeredCondition, nullptr);
537718778793b106498b931dd708a466cf3a6f6a0fMark Salyzyn    cleanSkip_Locked();
54a16f761faa258415b521aa6c9376c58d6c865529Mark Salyzyn}
550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
560175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynvoid LogTimeEntry::startReader_Locked(void) {
57765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    pthread_attr_t attr;
58765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn
590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    threadRunning = true;
60765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn
61765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    if (!pthread_attr_init(&attr)) {
62765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn        if (!pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) {
63501c373916e292764400dbae735f44b33378400fMark Salyzyn            if (!pthread_create(&mThread, &attr, LogTimeEntry::threadStart,
64501c373916e292764400dbae735f44b33378400fMark Salyzyn                                this)) {
65765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn                pthread_attr_destroy(&attr);
66765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn                return;
67765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn            }
680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        }
69765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn        pthread_attr_destroy(&attr);
70765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    }
71765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    threadRunning = false;
72765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    if (mClient) {
73765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn        mClient->decRef();
740175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
75765f7828918b0eebe70ab9b16c31a2587969fc7eMark Salyzyn    decRef_Locked();
760175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}
770175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
78501c373916e292764400dbae735f44b33378400fMark Salyzynvoid LogTimeEntry::threadStop(void* obj) {
79501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogTimeEntry* me = reinterpret_cast<LogTimeEntry*>(obj);
800175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
813c501b50b41086cde59a6811f4aa5cd3e736f5f2Mark Salyzyn    wrlock();
820175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->mNonBlock) {
840175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        me->error_Locked();
850175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
860175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
87501c373916e292764400dbae735f44b33378400fMark Salyzyn    SocketClient* client = me->mClient;
880175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
890175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->isError_Locked()) {
90501c373916e292764400dbae735f44b33378400fMark Salyzyn        LogReader& reader = me->mReader;
91501c373916e292764400dbae735f44b33378400fMark Salyzyn        LastLogTimes& times = reader.logbuf().mTimes;
920175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
930175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        LastLogTimes::iterator it = times.begin();
94501c373916e292764400dbae735f44b33378400fMark Salyzyn        while (it != times.end()) {
950175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn            if (*it == me) {
960175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn                times.erase(it);
97c3484161980cdea915c893a233f54b14a75d151fMark Salyzyn                me->release_nodelete_Locked();
980175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn                break;
990175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn            }
1000175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn            it++;
1010175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        }
1020175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
103ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn        me->mClient = nullptr;
1040175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        reader.release(client);
1050175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
1060175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1070175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (client) {
1080175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        client->decRef();
1090175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
1100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
111a16f761faa258415b521aa6c9376c58d6c865529Mark Salyzyn    me->threadRunning = false;
1120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    me->decRef_Locked();
1130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    unlock();
1150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}
1160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
117501c373916e292764400dbae735f44b33378400fMark Salyzynvoid* LogTimeEntry::threadStart(void* obj) {
1188daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn    prctl(PR_SET_NAME, "logd.reader.per");
1198daa9af02dc0e63ce220e3fa95bf5fe4d6b7a99aMark Salyzyn
120501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogTimeEntry* me = reinterpret_cast<LogTimeEntry*>(obj);
1210175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1220175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    pthread_cleanup_push(threadStop, obj);
1230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
124501c373916e292764400dbae735f44b33378400fMark Salyzyn    SocketClient* client = me->mClient;
1250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (!client) {
1260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        me->error();
127ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn        return nullptr;
1280175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
1290175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
130501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogBuffer& logbuf = me->mReader.logbuf();
1310175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1320175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    bool privileged = FlushCommand::hasReadLogs(client);
1338fa8896d2ed97eb274c62f0e386dabf2e2a82a45Mark Salyzyn    bool security = FlushCommand::hasSecurityLogs(client);
1340175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
135047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn    me->leadingDropped = true;
136047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn
1373c501b50b41086cde59a6811f4aa5cd3e736f5f2Mark Salyzyn    wrlock();
1380175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1395a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn    log_time start = me->mStart;
1400175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
141de4bb9c1a704d0eab3320b43c3964342f4b662dfMark Salyzyn    while (me->threadRunning && !me->isError_Locked()) {
142b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn        if (me->mTimeout.tv_sec || me->mTimeout.tv_nsec) {
143b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn            if (pthread_cond_timedwait(&me->threadTriggeredCondition,
144501c373916e292764400dbae735f44b33378400fMark Salyzyn                                       &timesLock, &me->mTimeout) == ETIMEDOUT) {
145b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn                me->mTimeout.tv_sec = 0;
146b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn                me->mTimeout.tv_nsec = 0;
147b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn            }
148b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn            if (!me->threadRunning || me->isError_Locked()) {
149b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn                break;
150b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn            }
151b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn        }
152b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn
1530175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        unlock();
1540175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        if (me->mTail) {
156ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn            logbuf.flushTo(client, start, nullptr, privileged, security,
157ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn                           FilterFirstPass, me);
158047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn            me->leadingDropped = true;
1590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        }
160ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn        start = logbuf.flushTo(client, start, me->mLastTid, privileged,
161ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn                               security, FilterSecondPass, me);
1620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1633c501b50b41086cde59a6811f4aa5cd3e736f5f2Mark Salyzyn        wrlock();
164a16f761faa258415b521aa6c9376c58d6c865529Mark Salyzyn
1650175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        if (start == LogBufferElement::FLUSH_ERROR) {
166a16f761faa258415b521aa6c9376c58d6c865529Mark Salyzyn            me->error_Locked();
167de4bb9c1a704d0eab3320b43c3964342f4b662dfMark Salyzyn            break;
1680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        }
1690175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1705a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn        me->mStart = start + log_time(0, 1);
171de4bb9c1a704d0eab3320b43c3964342f4b662dfMark Salyzyn
172a16f761faa258415b521aa6c9376c58d6c865529Mark Salyzyn        if (me->mNonBlock || !me->threadRunning || me->isError_Locked()) {
1730175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn            break;
1740175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        }
1750175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
176da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau        me->cleanSkip_Locked();
177da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau
178b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn        if (!me->mTimeout.tv_sec && !me->mTimeout.tv_nsec) {
179b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn            pthread_cond_wait(&me->threadTriggeredCondition, &timesLock);
180b75cce0389748bea111ca62af623645117e12d9dMark Salyzyn        }
1810175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
1820175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    unlock();
1840175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1850175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    pthread_cleanup_pop(true);
1860175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
187ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn    return nullptr;
1880175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}
1890175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1900175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// A first pass to count the number of elements
191501c373916e292764400dbae735f44b33378400fMark Salyzynint LogTimeEntry::FilterFirstPass(const LogBufferElement* element, void* obj) {
192501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogTimeEntry* me = reinterpret_cast<LogTimeEntry*>(obj);
1930175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
1943c501b50b41086cde59a6811f4aa5cd3e736f5f2Mark Salyzyn    LogTimeEntry::wrlock();
1950175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
196047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn    if (me->leadingDropped) {
197047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        if (element->getDropped()) {
198047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn            LogTimeEntry::unlock();
199047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn            return false;
200047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        }
201047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        me->leadingDropped = false;
202047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn    }
203047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn
2040175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->mCount == 0) {
2055a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn        me->mStart = element->getRealTime();
2060175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2070175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
208501c373916e292764400dbae735f44b33378400fMark Salyzyn    if ((!me->mPid || (me->mPid == element->getPid())) &&
209501c373916e292764400dbae735f44b33378400fMark Salyzyn        (me->isWatching(element->getLogId()))) {
2100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        ++me->mCount;
2110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    LogTimeEntry::unlock();
2140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    return false;
2160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}
2170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2180175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// A second pass to send the selected elements
219501c373916e292764400dbae735f44b33378400fMark Salyzynint LogTimeEntry::FilterSecondPass(const LogBufferElement* element, void* obj) {
220501c373916e292764400dbae735f44b33378400fMark Salyzyn    LogTimeEntry* me = reinterpret_cast<LogTimeEntry*>(obj);
2210175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2223c501b50b41086cde59a6811f4aa5cd3e736f5f2Mark Salyzyn    LogTimeEntry::wrlock();
2230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2245a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn    me->mStart = element->getRealTime();
225da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau
226da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau    if (me->skipAhead[element->getLogId()]) {
227da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau        me->skipAhead[element->getLogId()]--;
2288d7656b8c175cbb60162aff56cdfc51d551d9c14Mark Salyzyn        goto skip;
2290175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2300175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
231047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn    if (me->leadingDropped) {
232047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        if (element->getDropped()) {
233047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn            goto skip;
234047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        }
235047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn        me->leadingDropped = false;
236047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn    }
237047cc0729fd837a03b99db901941c1421ef15f96Mark Salyzyn
2380175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    // Truncate to close race between first and second pass
2390175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->mNonBlock && me->mTail && (me->mIndex >= me->mCount)) {
240f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn        goto stop;
2410175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2420175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
243da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau    if (!me->isWatching(element->getLogId())) {
2440175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        goto skip;
2450175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2460175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2470175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->mPid && (me->mPid != element->getPid())) {
2480175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        goto skip;
2490175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2500175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2510175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (me->isError_Locked()) {
252f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn        goto stop;
2530175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2540175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (!me->mTail) {
2560175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        goto ok;
2570175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2580175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    ++me->mIndex;
2600175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2610175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if ((me->mCount > me->mTail) && (me->mIndex <= (me->mCount - me->mTail))) {
2620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        goto skip;
2630175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2640175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2650175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    if (!me->mNonBlock) {
2660175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        me->mTail = 0;
2670175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
2680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2690175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynok:
270da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau    if (!me->skipAhead[element->getLogId()]) {
2710175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        LogTimeEntry::unlock();
2720175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn        return true;
2730175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    }
274501c373916e292764400dbae735f44b33378400fMark Salyzyn// FALLTHRU
2750175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn
2760175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynskip:
2770175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    LogTimeEntry::unlock();
2780175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn    return false;
279f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn
280f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzynstop:
281f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn    LogTimeEntry::unlock();
282f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn    return -1;
2830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}
284da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau
285da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiauvoid LogTimeEntry::cleanSkip_Locked(void) {
286ae2abf112ca8555dfc09eb1fc4b8bd637e4bc7ccMark Salyzyn    memset(skipAhead, 0, sizeof(skipAhead));
287da6495d06f1798ea81cebbfbdd44f16135e1a3cdTraianX Schiau}
288