From 8922d699532cf5027c8cabe53aaf8be4db470764 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Sat, 13 Nov 2004 16:46:56 -0500 Subject: [PATCH] change the serialization of a packet so that we don't do a nameOut. This fixes a subtle bug in serialization that can pop up. --HG-- extra : convert_revision : b52df977dcbef1c9bd0d4405ba0b36dff3737cdf --- dev/etherlink.cc | 13 +++++-------- dev/etherpkt.cc | 15 ++++++++------- dev/etherpkt.hh | 6 ++++-- dev/ns_gige.cc | 26 ++++++++++---------------- 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/dev/etherlink.cc b/dev/etherlink.cc index a361713cd..1e2be41fe 100644 --- a/dev/etherlink.cc +++ b/dev/etherlink.cc @@ -185,10 +185,8 @@ EtherLink::Link::serialize(ostream &os) SERIALIZE_SCALAR(event_time); } - if (packet_exists) { - nameOut(os, csprintf("%s.packet", name())); - packet->serialize(os); - } + if (packet_exists) + packet->serialize("packet", os); } void @@ -198,7 +196,7 @@ EtherLink::Link::unserialize(Checkpoint *cp, const string §ion) UNSERIALIZE_SCALAR(packet_exists); if (packet_exists) { packet = new PacketData; - packet->unserialize(cp, csprintf("%s.packet", section)); + packet->unserialize("packet", cp, section); } bool event_scheduled; @@ -238,8 +236,7 @@ LinkDelayEvent::serialize(ostream &os) Event::serialize(os); SERIALIZE_OBJPTR(link); - nameOut(os, csprintf("%s.packet", name())); - packet->serialize(os); + packet->serialize("packet", os); } @@ -248,7 +245,7 @@ LinkDelayEvent::unserialize(Checkpoint *cp, const string §ion) { Event::unserialize(cp, section); packet = new PacketData; - packet->unserialize(cp, csprintf("%s.packet", section)); + packet->unserialize("packet", cp, section); } diff --git a/dev/etherpkt.cc b/dev/etherpkt.cc index 273b8ee64..bf60bc150 100644 --- a/dev/etherpkt.cc +++ b/dev/etherpkt.cc @@ -28,22 +28,23 @@ #include +#include "base/misc.hh" #include "dev/etherpkt.hh" #include "sim/serialize.hh" using namespace std; void -PacketData::serialize(ostream &os) +PacketData::serialize(const string &base, ostream &os) { - SERIALIZE_SCALAR(length); - SERIALIZE_ARRAY(data, length); + paramOut(os, base + ".length", length); + arrayParamOut(os, base + ".data", data, length); } void -PacketData::unserialize(Checkpoint *cp, const string §ion) +PacketData::unserialize(const string &base, Checkpoint *cp, + const string §ion) { - UNSERIALIZE_SCALAR(length); - data = new uint8_t[length]; - UNSERIALIZE_ARRAY(data, length); + paramIn(cp, section, base + ".length", length); + arrayParamIn(cp, section, base + ".data", data, length); } diff --git a/dev/etherpkt.hh b/dev/etherpkt.hh index 1b6e9858f..7a7809f0a 100644 --- a/dev/etherpkt.hh +++ b/dev/etherpkt.hh @@ -52,13 +52,15 @@ class PacketData : public RefCounted public: PacketData() : data(NULL), length(0) { } + explicit PacketData(size_t size) : data(new uint8_t[size]), length(0) { } PacketData(std::auto_ptr d, int l) : data(d.release()), length(l) { } ~PacketData() { if (data) delete [] data; } public: - void serialize(std::ostream &os); - void unserialize(Checkpoint *cp, const std::string §ion); + void serialize(const std::string &base, std::ostream &os); + void unserialize(const std::string &base, Checkpoint *cp, + const std::string §ion); }; typedef RefCountingPtr PacketPtr; diff --git a/dev/ns_gige.cc b/dev/ns_gige.cc index 79b128025..39bae07ab 100644 --- a/dev/ns_gige.cc +++ b/dev/ns_gige.cc @@ -2123,19 +2123,15 @@ NSGigE::serialize(ostream &os) SERIALIZE_SCALAR(txNumPkts); int i = 0; pktiter_t end = txFifo.end(); - for (pktiter_t p = txFifo.begin(); p != end; ++p) { - nameOut(os, csprintf("%s.txFifo%d", name(), i++)); - (*p)->serialize(os); - } + for (pktiter_t p = txFifo.begin(); p != end; ++p) + (*p)->serialize(csprintf("txFifo%d", i++), os); int rxNumPkts = rxFifo.size(); SERIALIZE_SCALAR(rxNumPkts); i = 0; end = rxFifo.end(); - for (pktiter_t p = rxFifo.begin(); p != end; ++p) { - nameOut(os, csprintf("%s.rxFifo%d", name(), i++)); - (*p)->serialize(os); - } + for (pktiter_t p = rxFifo.begin(); p != end; ++p) + (*p)->serialize(csprintf("rxFifo%d", i++), os); /* * Serialize the various helper variables @@ -2143,8 +2139,7 @@ NSGigE::serialize(ostream &os) bool txPacketExists = txPacket; SERIALIZE_SCALAR(txPacketExists); if (txPacketExists) { - nameOut(os, csprintf("%s.txPacket", name())); - txPacket->serialize(os); + txPacket->serialize("txPacket", os); uint32_t txPktBufPtr = (uint32_t) (txPacketBufPtr - txPacket->data); SERIALIZE_SCALAR(txPktBufPtr); } @@ -2152,8 +2147,7 @@ NSGigE::serialize(ostream &os) bool rxPacketExists = rxPacket; SERIALIZE_SCALAR(rxPacketExists); if (rxPacketExists) { - nameOut(os, csprintf("%s.rxPacket", name())); - rxPacket->serialize(os); + rxPacket->serialize("rxPacket", os); uint32_t rxPktBufPtr = (uint32_t) (rxPacketBufPtr - rxPacket->data); SERIALIZE_SCALAR(rxPktBufPtr); } @@ -2281,7 +2275,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string §ion) int i; for (i = 0; i < txNumPkts; ++i) { PacketPtr p = new PacketData; - p->unserialize(cp, csprintf("%s.rxFifo%d", section, i)); + p->unserialize(csprintf("rxFifo%d", i), cp, section); txFifo.push_back(p); } @@ -2289,7 +2283,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string §ion) UNSERIALIZE_SCALAR(rxNumPkts); for (i = 0; i < rxNumPkts; ++i) { PacketPtr p = new PacketData; - p->unserialize(cp, csprintf("%s.rxFifo%d", section, i)); + p->unserialize(csprintf("rxFifo%d", i), cp, section); rxFifo.push_back(p); } @@ -2300,7 +2294,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string §ion) UNSERIALIZE_SCALAR(txPacketExists); if (txPacketExists) { txPacket = new PacketData; - txPacket->unserialize(cp, csprintf("%s.txPacket", section)); + txPacket->unserialize("txPacket", cp, section); uint32_t txPktBufPtr; UNSERIALIZE_SCALAR(txPktBufPtr); txPacketBufPtr = (uint8_t *) txPacket->data + txPktBufPtr; @@ -2312,7 +2306,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string §ion) rxPacket = 0; if (rxPacketExists) { rxPacket = new PacketData; - rxPacket->unserialize(cp, csprintf("%s.rxPacket", section)); + rxPacket->unserialize("rxPacket", cp, section); uint32_t rxPktBufPtr; UNSERIALIZE_SCALAR(rxPktBufPtr); rxPacketBufPtr = (uint8_t *) rxPacket->data + rxPktBufPtr;