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).
This commit is contained in:
Andreas Sandberg
2015-08-07 09:59:19 +01:00
parent 39d8034475
commit 9b2426ecfc
8 changed files with 382 additions and 328 deletions

View File

@@ -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);

View File

@@ -109,11 +109,11 @@ class Terminal : public SimObject
void accept();
protected:
CircleBuf txbuf;
CircleBuf rxbuf;
CircleBuf<char> txbuf;
CircleBuf<char> rxbuf;
std::ostream *outfile;
#if TRACING_ON == 1
CircleBuf linebuf;
CircleBuf<char> linebuf;
#endif
public: