From 9b2426ecfc4f004fe77badb4cc64f93af3a2d0d3 Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Fri, 7 Aug 2015 09:59:19 +0100 Subject: base: Rewrite the CircleBuf to fix bugs and add serialization The CircleBuf class has at least one bug causing it to overwrite the wrong elements when wrapping. The current code has a lot of unused functionality and duplicated code. This changeset replaces the old implementation with a new version that supports serialization and arbitrary types in the buffer (not just char). --- src/dev/terminal.cc | 12 ++++++++---- src/dev/terminal.hh | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'src/dev') diff --git a/src/dev/terminal.cc b/src/dev/terminal.cc index b4fb50f6e..e653ee115 100644 --- a/src/dev/terminal.cc +++ b/src/dev/terminal.cc @@ -205,8 +205,12 @@ Terminal::accept() write((const uint8_t *)stream.str().c_str(), stream.str().size()); DPRINTFN("attach terminal %d\n", number); - - txbuf.readall(data_fd); + 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); + write((const uint8_t *)buf, chunk_len); + } } void @@ -329,7 +333,7 @@ Terminal::out(char c) DPRINTF(Terminal, "%s\n", buffer); delete [] buffer; } else { - linebuf.write(c); + linebuf.write(&c, 1); } } @@ -337,7 +341,7 @@ Terminal::out(char c) } #endif - txbuf.write(c); + txbuf.write(&c, 1); if (data_fd >= 0) write(c); diff --git a/src/dev/terminal.hh b/src/dev/terminal.hh index f7a860ac5..82246b2c1 100644 --- a/src/dev/terminal.hh +++ b/src/dev/terminal.hh @@ -109,11 +109,11 @@ class Terminal : public SimObject void accept(); protected: - CircleBuf txbuf; - CircleBuf rxbuf; + CircleBuf txbuf; + CircleBuf rxbuf; std::ostream *outfile; #if TRACING_ON == 1 - CircleBuf linebuf; + CircleBuf linebuf; #endif public: -- cgit v1.2.3