diff -r 1f92ce16e171 -r 2c9b125d5a42 src/base/circlebuf.hh --- a/src/base/circlebuf.hh Wed Mar 30 16:21:27 2016 +0100 +++ b/src/base/circlebuf.hh Fri Apr 01 14:12:13 2016 +0100 @@ -103,24 +103,36 @@ */ template void peek(OutputIterator out, size_t len) const { - panic_if(len > size(), + peek(out, 0, len); + } + + /** + * Copy buffer contents without advancing the read pointer + * + * @param out Output iterator/pointer + * @param offset Offset into the ring buffer + * @param len Number of elements to copy + */ + template + void peek(OutputIterator out, off_t offset, size_t len) const { + panic_if(offset + len > size(), "Trying to read past end of circular buffer.\n"); - if (_start + len <= buf.size()) { - std::copy(buf.begin() + _start, - buf.begin() + _start + len, + const off_t real_start((offset + _start) % buf.size()); + if (real_start + len <= buf.size()) { + std::copy(buf.begin() + real_start, + buf.begin() + real_start + len, out); } else { - const size_t head_size(buf.size() - _start); + const size_t head_size(buf.size() - real_start); const size_t tail_size(len - head_size); - std::copy(buf.begin() + _start, buf.end(), + std::copy(buf.begin() + real_start, buf.end(), out); std::copy(buf.begin(), buf.begin() + tail_size, out + head_size); } } - /** * Copy buffer contents and advance the read pointer * diff -r 1f92ce16e171 -r 2c9b125d5a42 src/dev/terminal.cc --- a/src/dev/terminal.cc Wed Mar 30 16:21:27 2016 +0100 +++ b/src/dev/terminal.cc Fri Apr 01 14:12:13 2016 +0100 @@ -204,7 +204,7 @@ char buf[1024]; for (size_t i = 0; i < txbuf.size(); i += sizeof(buf)) { const size_t chunk_len(std::min(txbuf.size() - i, sizeof(buf))); - txbuf.peek(buf, chunk_len); + txbuf.peek(buf, i, chunk_len); write((const uint8_t *)buf, chunk_len); } }