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