FdBuffer.cpp revision 0a3406fc4f8e9a8c8a9155fc7886a0496f692496
11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/*
21754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Copyright (C) 2016 The Android Open Source Project
31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License.
61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at
71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software
111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and
141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License.
151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
171754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#define LOG_TAG "incidentd"
181754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include "FdBuffer.h"
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
211754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <cutils/log.h>
221754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <utils/SystemClock.h>
231754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
241754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <fcntl.h>
251754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <poll.h>
261754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <unistd.h>
270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin#include <wait.h>
281754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinconst ssize_t BUFFER_SIZE = 16 * 1024; // 16 KB
301754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratoconst ssize_t MAX_BUFFER_COUNT = 256; // 4 MB max
311754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
321754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoFdBuffer::FdBuffer()
331754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    :mBuffers(),
341754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mStartTime(-1),
351754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mFinishTime(-1),
361754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mCurrentWritten(-1),
371754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mTimedOut(false),
381754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato     mTruncated(false)
391754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
401754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoFdBuffer::~FdBuffer()
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    const int N = mBuffers.size();
451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    for (int i=0; i<N; i++) {
461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        uint8_t* buf = mBuffers[i];
471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        free(buf);
481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatus_t
521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoFdBuffer::read(int fd, int64_t timeout)
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    struct pollfd pfds = {
551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        .fd = fd,
561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        .events = POLLIN
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    };
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mStartTime = uptimeMillis();
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
601754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
611754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    uint8_t* buf = NULL;
631754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    while (true) {
641754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (mCurrentWritten >= BUFFER_SIZE || mCurrentWritten < 0) {
651754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (mBuffers.size() == MAX_BUFFER_COUNT) {
661754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                mTruncated = true;
671754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                break;
681754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
691754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            buf = (uint8_t*)malloc(BUFFER_SIZE);
701754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if (buf == NULL) {
711754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return NO_MEMORY;
721754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
731754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            mBuffers.push_back(buf);
741754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            mCurrentWritten = 0;
751754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
761754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
771754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        int64_t remainingTime = (mStartTime + timeout) - uptimeMillis();
781754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (remainingTime <= 0) {
791754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            mTimedOut = true;
801754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            break;
811754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
821754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
831754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        int count = poll(&pfds, 1, remainingTime);
841754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        if (count == 0) {
851754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            mTimedOut = true;
861754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            break;
871754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else if (count < 0) {
881754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            return -errno;
891754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        } else {
901754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            if ((pfds.revents & POLLERR) != 0) {
911754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                return errno != 0 ? -errno : UNKNOWN_ERROR;
921754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            } else {
931754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                ssize_t amt = ::read(fd, buf + mCurrentWritten, BUFFER_SIZE - mCurrentWritten);
941754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                if (amt < 0) {
951754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    if (errno == EAGAIN || errno == EWOULDBLOCK) {
961754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        continue;
971754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    } else {
981754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                        return -errno;
991754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    }
1001754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                } else if (amt == 0) {
1011754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                    break;
1021754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                }
1031754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato                mCurrentWritten += amt;
1041754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato            }
1051754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        }
1061754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
1071754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1081754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    mFinishTime = uptimeMillis();
1091754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return NO_ERROR;
1101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
1111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
1120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jinstatus_t
1130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi JinFdBuffer::readProcessedDataInStream(int fd, int toFd, int fromFd, int64_t timeoutMs)
1140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin{
1150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    struct pollfd pfds[] = {
1160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        { .fd = fd,     .events = POLLIN  },
1170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        { .fd = toFd,   .events = POLLOUT },
1180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        { .fd = fromFd, .events = POLLIN  },
1190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    };
1200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    mStartTime = uptimeMillis();
1220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    // mark all fds non blocking
1240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
1250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fcntl(toFd, F_SETFL, fcntl(toFd, F_GETFL, 0) | O_NONBLOCK);
1260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    fcntl(fromFd, F_SETFL, fcntl(fromFd, F_GETFL, 0) | O_NONBLOCK);
1270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    // A circular buffer holds data read from fd and writes to parsing process
1290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    uint8_t cirBuf[BUFFER_SIZE];
1300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    size_t cirSize = 0;
1310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    int rpos = 0, wpos = 0;
1320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    // This is the buffer used to store processed data
1340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    uint8_t* buf = NULL;
1350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    while (true) {
1360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (mCurrentWritten >= BUFFER_SIZE || mCurrentWritten < 0) {
1370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (mBuffers.size() == MAX_BUFFER_COUNT) {
1380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                mTruncated = true;
1390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                break;
1400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1410a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            buf = (uint8_t*)malloc(BUFFER_SIZE);
1420a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (buf == NULL) {
1430a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                return NO_MEMORY;
1440a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1450a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            mBuffers.push_back(buf);
1460a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            mCurrentWritten = 0;
1470a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1480a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1490a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        int64_t remainingTime = (mStartTime + timeoutMs) - uptimeMillis();
1500a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (remainingTime <= 0) {
1510a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            mTimedOut = true;
1520a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            break;
1530a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1540a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // wait for any pfds to be ready to perform IO
1560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        int count = poll(pfds, 3, remainingTime);
1570a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (count == 0) {
1580a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            mTimedOut = true;
1590a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            break;
1600a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        } else if (count < 0) {
1610a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            return -errno;
1620a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1630a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1640a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // make sure no errors occur on any fds
1650a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        for (int i = 0; i < 3; ++i) {
1660a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if ((pfds[i].revents & POLLERR) != 0) {
1670a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                return errno != 0 ? -errno : UNKNOWN_ERROR;
1680a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1690a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1700a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1710a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // read from fd
1720a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (cirSize != BUFFER_SIZE && pfds[0].fd != -1) {
1730a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            ssize_t amt;
1740a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (rpos >= wpos) {
1750a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                amt = ::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos);
1760a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } else {
1770a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                amt = :: read(fd, cirBuf + rpos, wpos - rpos);
1780a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1790a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (amt < 0) {
1800a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
1810a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                    return -errno;
1820a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                } // otherwise just continue
1830a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } else if (amt == 0) {  // reach EOF so don't have to poll pfds[0].
1840a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                ::close(pfds[0].fd);
1850a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                pfds[0].fd = -1;
1860a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } else {
1870a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                rpos += amt;
1880a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                cirSize += amt;
1890a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
1900a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
1910a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
1920a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // write to parsing process
1930a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (cirSize > 0 && pfds[1].fd != -1) {
1940a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            ssize_t amt;
1950a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (rpos > wpos) {
1960a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                amt = ::write(toFd, cirBuf + wpos, rpos - wpos);
1970a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } else {
1980a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                amt = ::write(toFd, cirBuf + wpos, BUFFER_SIZE - wpos);
1990a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
2000a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (amt < 0) {
2010a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
2020a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                    return -errno;
2030a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                } // otherwise just continue
2040a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } else {
2050a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                wpos += amt;
2060a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                cirSize -= amt;
2070a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            }
2080a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
2090a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2100a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // if buffer is empty and fd is closed, close write fd.
2110a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (cirSize == 0 && pfds[0].fd == -1 && pfds[1].fd != -1) {
2120a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            ::close(pfds[1].fd);
2130a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            pfds[1].fd = -1;
2140a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
2150a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2160a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // circular buffer, reset rpos and wpos
2170a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (rpos >= BUFFER_SIZE) {
2180a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            rpos = 0;
2190a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
2200a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (wpos >= BUFFER_SIZE) {
2210a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            wpos = 0;
2220a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
2230a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2240a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        // read from parsing process
2250a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        ssize_t amt = ::read(fromFd, buf + mCurrentWritten, BUFFER_SIZE - mCurrentWritten);
2260a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        if (amt < 0) {
2270a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
2280a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin                return -errno;
2290a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            } // otherwise just continue
2300a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        } else if (amt == 0) {
2310a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            break;
2320a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        } else {
2330a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin            mCurrentWritten += amt;
2340a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin        }
2350a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    }
2360a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2370a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    mFinishTime = uptimeMillis();
2380a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin    return NO_ERROR;
2390a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin}
2400a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin
2411754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratosize_t
2421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoFdBuffer::size()
2431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
2441754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return ((mBuffers.size() - 1) * BUFFER_SIZE) + mCurrentWritten;
2451754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
2461754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2471754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratostatus_t
2481754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe OnoratoFdBuffer::write(ReportRequestSet* reporter)
2491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato{
2501754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    const int N = mBuffers.size() - 1;
2511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    for (int i=0; i<N; i++) {
2521754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato        reporter->write(mBuffers[i], BUFFER_SIZE);
2531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    }
2541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    reporter->write(mBuffers[N], mCurrentWritten);
2551754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato    return NO_ERROR;
2561754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato}
2571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
2581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
259