| 20 | const size_t Buffer::kInitialSize = 1024; |
| 21 | |
| 22 | ssize_t Buffer::ReadFromFD(evpp_socket_t fd, int* savedErrno) { |
| 23 | // saved an ioctl()/FIONREAD call to tell how much to read |
| 24 | char extrabuf[65536]; |
| 25 | struct iovec vec[2]; |
| 26 | const size_t writable = WritableBytes(); |
| 27 | vec[0].iov_base = begin() + write_index_; |
| 28 | vec[0].iov_len = writable; |
| 29 | vec[1].iov_base = extrabuf; |
| 30 | vec[1].iov_len = sizeof extrabuf; |
| 31 | // when there is enough space in this buffer, don't read into extrabuf. |
| 32 | // when extrabuf is used, we read 64k bytes at most. |
| 33 | const int iovcnt = (writable < sizeof extrabuf) ? 2 : 1; |
| 34 | const ssize_t n = ::readv(fd, vec, iovcnt); |
| 35 | |
| 36 | if (n < 0) { |
| 37 | *savedErrno = errno; |
| 38 | } else if (static_cast<size_t>(n) <= writable) { |
| 39 | write_index_ += n; |
| 40 | } else { |
| 41 | write_index_ = capacity_; |
| 42 | Append(extrabuf, n - writable); |
| 43 | } |
| 44 | |
| 45 | return n; |
| 46 | } |
| 47 | } |
no test coverage detected