change the serialization of a packet so that we don't
authorNathan Binkert <binkertn@umich.edu>
Sat, 13 Nov 2004 21:46:56 +0000 (16:46 -0500)
committerNathan Binkert <binkertn@umich.edu>
Sat, 13 Nov 2004 21:46:56 +0000 (16:46 -0500)
do a nameOut.  This fixes a subtle bug in serialization that
can pop up.

--HG--
extra : convert_revision : b52df977dcbef1c9bd0d4405ba0b36dff3737cdf

dev/etherlink.cc
dev/etherpkt.cc
dev/etherpkt.hh
dev/ns_gige.cc

index a361713cd61fc88ef6de0ece3183462e6cf9c20d..1e2be41fe488cfc840b2718c1967ac29678854f5 100644 (file)
@@ -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 &section)
     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 &section)
 {
     Event::unserialize(cp, section);
     packet = new PacketData;
-    packet->unserialize(cp, csprintf("%s.packet", section));
+    packet->unserialize("packet", cp, section);
 }
 
 
index 273b8ee646ddc91de159b48148adda49bb98df80..bf60bc150b00465f26688ae1f7335abbd4b22ab3 100644 (file)
 
 #include <iostream>
 
+#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 &section)
+PacketData::unserialize(const string &base, Checkpoint *cp,
+                        const string &section)
 {
-    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);
 }
index 1b6e9858fe268ad7a90222e7b5abf3f7d36d8cde..7a7809f0a1f12f5ad8a34f73d0df335938d05c94 100644 (file)
@@ -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<uint8_t> 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 &section);
+    void serialize(const std::string &base, std::ostream &os);
+    void unserialize(const std::string &base, Checkpoint *cp,
+                     const std::string &section);
 };
 
 typedef RefCountingPtr<PacketData> PacketPtr;
index 79b1280258c9fa98082867e058e48a5977bad916..39bae07ab25fb5a613f61fc386e814de7847cccb 100644 (file)
@@ -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 &section)
     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 &section)
     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 &section)
     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 &section)
     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;