diff -r 248630994201 -r 51aadf033db4 src/base/circlebuf.hh --- a/src/base/circlebuf.hh Mon Jun 08 18:08:58 2015 +0100 +++ b/src/base/circlebuf.hh Mon Jun 08 18:09:34 2015 +0100 @@ -59,6 +59,9 @@ void write(char b); void write(const char *b); void write(const char *b, int len); + + /** Copy buffer contents without altering the read pointer */ + void peek(char *b, int len) const; }; #endif // __CIRCLEBUF_HH__ diff -r 248630994201 -r 51aadf033db4 src/base/circlebuf.cc --- a/src/base/circlebuf.cc Mon Jun 08 18:08:58 2015 +0100 +++ b/src/base/circlebuf.cc Mon Jun 08 18:09:34 2015 +0100 @@ -97,6 +97,25 @@ } void +CircleBuf::peek(char *b, int len) const +{ + if (_stop > _start) { + len = min(len, _stop - _start); + memcpy(b, _buf + _start, len); + } + else { + int endlen = _buflen - _start; + if (endlen > len) { + memcpy(b, _buf + _start, len); + } + else { + memcpy(b, _buf + _start, endlen); + memcpy(b + endlen, _buf, min(len - endlen, _stop)); + } + } +} + +void CircleBuf::read(int fd, int len) { _size -= len; diff -r 248630994201 -r 51aadf033db4 src/sim/serialize.hh --- a/src/sim/serialize.hh Mon Jun 08 18:08:58 2015 +0100 +++ b/src/sim/serialize.hh Mon Jun 08 18:09:34 2015 +0100 @@ -60,6 +60,7 @@ #include "base/bitunion.hh" #include "base/types.hh" +class CircleBuf; class IniFile; class Serializable; class CheckpointIn; @@ -120,6 +121,9 @@ void arrayParamOut(CheckpointOut &cp, const std::string &name, const std::list ¶m); +void arrayParamOut(CheckpointOut &cp, const std::string &name, + const CircleBuf ¶m); + template void arrayParamIn(CheckpointIn &cp, const std::string &name, T *param, unsigned size); @@ -132,6 +136,9 @@ void arrayParamIn(CheckpointIn &cp, const std::string &name, std::list ¶m); +void arrayParamIn(CheckpointIn &cp, const std::string &name, + CircleBuf ¶m); + void objParamIn(CheckpointIn &cp, const std::string &name, SimObject * ¶m); diff -r 248630994201 -r 51aadf033db4 src/sim/serialize.cc --- a/src/sim/serialize.cc Mon Jun 08 18:08:58 2015 +0100 +++ b/src/sim/serialize.cc Mon Jun 08 18:09:34 2015 +0100 @@ -55,6 +55,7 @@ #include #include +#include "base/circlebuf.hh" #include "base/framebuffer.hh" #include "base/inifile.hh" #include "base/misc.hh" @@ -210,6 +211,14 @@ os << "\n"; } +void arrayParamOut(CheckpointOut &cp, const std::string &name, + const CircleBuf ¶m) +{ + std::vector temp(param.size()); + param.peek(temp.data(), temp.size()); + arrayParamOut(cp, name, temp); +} + template void paramIn(CheckpointIn &cp, const string &name, T ¶m) @@ -367,6 +376,17 @@ } } +void +arrayParamIn(CheckpointIn &cp, const std::string &name, + CircleBuf ¶m) +{ + std::vector temp; + arrayParamIn(cp, name, temp); + + param.flush(); + param.write(temp.data(), temp.size()); +} + void objParamIn(CheckpointIn &cp, const string &name, SimObject * ¶m)