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 ×Lock, &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, ×Lock); 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