diff options
Diffstat (limited to 'cmds/incidentd/src/FdBuffer.cpp')
-rw-r--r-- | cmds/incidentd/src/FdBuffer.cpp | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp index 04819ec75a09..b46c9e357fc4 100644 --- a/cmds/incidentd/src/FdBuffer.cpp +++ b/cmds/incidentd/src/FdBuffer.cpp @@ -31,12 +31,18 @@ namespace os { namespace incidentd { const ssize_t BUFFER_SIZE = 16 * 1024; // 16 KB -const ssize_t MAX_BUFFER_COUNT = 256; // 4 MB max +const ssize_t MAX_BUFFER_COUNT = 1536; // 24 MB max FdBuffer::FdBuffer() - : mBuffer(BUFFER_SIZE), mStartTime(-1), mFinishTime(-1), mTimedOut(false), mTruncated(false) {} + :mBuffer(new EncodedBuffer(BUFFER_SIZE)), + mStartTime(-1), + mFinishTime(-1), + mTimedOut(false), + mTruncated(false) { +} -FdBuffer::~FdBuffer() {} +FdBuffer::~FdBuffer() { +} status_t FdBuffer::read(int fd, int64_t timeout) { struct pollfd pfds = {.fd = fd, .events = POLLIN}; @@ -45,12 +51,12 @@ status_t FdBuffer::read(int fd, int64_t timeout) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); while (true) { - if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { + if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { mTruncated = true; VLOG("Truncating data"); break; } - if (mBuffer.writeBuffer() == NULL) { + if (mBuffer->writeBuffer() == NULL) { VLOG("No memory"); return NO_MEMORY; } @@ -76,7 +82,7 @@ status_t FdBuffer::read(int fd, int64_t timeout) { return errno != 0 ? -errno : UNKNOWN_ERROR; } else { ssize_t amt = TEMP_FAILURE_RETRY( - ::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite())); + ::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite())); if (amt < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { continue; @@ -88,7 +94,7 @@ status_t FdBuffer::read(int fd, int64_t timeout) { VLOG("Reached EOF of fd=%d", fd); break; } - mBuffer.wp()->move(amt); + mBuffer->wp()->move(amt); } } } @@ -100,28 +106,28 @@ status_t FdBuffer::readFully(int fd) { mStartTime = uptimeMillis(); while (true) { - if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { + if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { // Don't let it get too big. mTruncated = true; VLOG("Truncating data"); break; } - if (mBuffer.writeBuffer() == NULL) { + if (mBuffer->writeBuffer() == NULL) { VLOG("No memory"); return NO_MEMORY; } ssize_t amt = - TEMP_FAILURE_RETRY(::read(fd, mBuffer.writeBuffer(), mBuffer.currentToWrite())); + TEMP_FAILURE_RETRY(::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite())); if (amt < 0) { VLOG("Fail to read %d: %s", fd, strerror(errno)); return -errno; } else if (amt == 0) { - VLOG("Done reading %zu bytes", mBuffer.size()); + VLOG("Done reading %zu bytes", mBuffer->size()); // We're done. break; } - mBuffer.wp()->move(amt); + mBuffer->wp()->move(amt); } mFinishTime = uptimeMillis(); @@ -150,12 +156,12 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f // This is the buffer used to store processed data while (true) { - if (mBuffer.size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { + if (mBuffer->size() >= MAX_BUFFER_COUNT * BUFFER_SIZE) { VLOG("Truncating data"); mTruncated = true; break; } - if (mBuffer.writeBuffer() == NULL) { + if (mBuffer->writeBuffer() == NULL) { VLOG("No memory"); return NO_MEMORY; } @@ -248,7 +254,7 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f // read from parsing process ssize_t amt = TEMP_FAILURE_RETRY( - ::read(fromFd.get(), mBuffer.writeBuffer(), mBuffer.currentToWrite())); + ::read(fromFd.get(), mBuffer->writeBuffer(), mBuffer->currentToWrite())); if (amt < 0) { if (!(errno == EAGAIN || errno == EWOULDBLOCK)) { VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno)); @@ -258,7 +264,7 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f VLOG("Reached EOF of fromFd %d", fromFd.get()); break; } else { - mBuffer.wp()->move(amt); + mBuffer->wp()->move(amt); } } @@ -266,9 +272,25 @@ status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd f return NO_ERROR; } -size_t FdBuffer::size() const { return mBuffer.size(); } +status_t FdBuffer::write(uint8_t const* buf, size_t size) { + return mBuffer->writeRaw(buf, size); +} + +status_t FdBuffer::write(const sp<ProtoReader>& reader) { + return mBuffer->writeRaw(reader); +} + +status_t FdBuffer::write(const sp<ProtoReader>& reader, size_t size) { + return mBuffer->writeRaw(reader, size); +} -EncodedBuffer::iterator FdBuffer::data() const { return mBuffer.begin(); } +size_t FdBuffer::size() const { + return mBuffer->size(); +} + +sp<EncodedBuffer> FdBuffer::data() const { + return mBuffer; +} } // namespace incidentd } // namespace os |