dev: Use shared_ptr for EthPacketData
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 16 Oct 2014 09:49:46 +0000 (05:49 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 16 Oct 2014 09:49:46 +0000 (05:49 -0400)
This patch transitions the EthPacketData from the ad-hoc
RefCountingPtr to the c++11 shared_ptr. There are no changes in
behaviour, and the code modifications are mainly replacing "new" with
"make_shared".

The bool casting operator for the shared_ptr is explicit, and we must
therefore either cast it, compare it to NULL (p != nullptr), double
negate it (!!p) or do a (p ? true : false).

src/base/inet.hh
src/dev/etherlink.cc
src/dev/etherpkt.hh
src/dev/ethertap.cc
src/dev/i8254xGBe.cc
src/dev/ns_gige.cc
src/dev/pktfifo.cc
src/dev/sinic.cc

index 5130a072ca9b0ff2192a9549b7d2a4449ad1d594..07bbdc3b4b868ea7c3eecf877fc5636d879bda63 100644 (file)
@@ -182,7 +182,7 @@ class EthPtr
     const EthPacketPtr packet() const { return p; }
     EthPacketPtr packet() { return p; }
     bool operator!() const { return !p; }
-    operator bool() const { return p; }
+    operator bool() const { return (p != nullptr); }
     int off() const { return 0; }
     int pstart() const { return off() + ((const EthHdr*)p->data)->size(); }
 };
@@ -324,7 +324,7 @@ class IpPtr
     const EthPacketPtr packet() const { return p; }
     EthPacketPtr packet() { return p; }
     bool operator!() const { return !p; }
-    operator bool() const { return p; }
+    operator bool() const { return (p != nullptr); }
     int off() const { return (sizeof(eth_hdr) + ((eth_hdr_vlan) ? 4 : 0)); }
     int pstart() const { return (off() + get()->size()); }
 };
@@ -440,7 +440,7 @@ class Ip6Ptr
     const EthPacketPtr packet() const { return p; }
     EthPacketPtr packet() { return p; }
     bool operator!() const { return !p; }
-    operator bool() const { return p; }
+    operator bool() const { return (p != nullptr); }
     int off() const { return sizeof(eth_hdr) + ((eth_hdr_vlan) ? 4 : 0); }
     int pstart() const { return off() + get()->size(); }
 };
@@ -576,7 +576,7 @@ class TcpPtr
     const EthPacketPtr packet() const { return p; }
     EthPacketPtr packet() { return p; }
     bool operator!() const { return !p; }
-    operator bool() const { return p; }
+    operator bool() const { return (p != nullptr); }
     int off() const { return _off; }
     int pstart() const { return off() + get()->size(); }
 };
@@ -671,7 +671,7 @@ class UdpPtr
     const EthPacketPtr packet() const { return p; }
     EthPacketPtr packet() { return p; }
     bool operator!() const { return !p; }
-    operator bool() const { return p; }
+    operator bool() const { return (p != nullptr); }
     int off() const { return _off; }
     int pstart() const { return off() + get()->size(); }
 };
index 0117bb7c2c0cee9f4b44c8e2c131a5aa4a4f35e6..c5ef66d998a6617f096b54755ca8f453ac093f87 100644 (file)
@@ -195,7 +195,7 @@ EtherLink::Link::transmit(EthPacketPtr pkt)
 void
 EtherLink::Link::serialize(const string &base, ostream &os)
 {
-    bool packet_exists = packet;
+    bool packet_exists = packet != nullptr;
     paramOut(os, base + ".packet_exists", packet_exists);
     if (packet_exists)
         packet->serialize(base + ".packet", os);
@@ -216,7 +216,7 @@ EtherLink::Link::unserialize(const string &base, Checkpoint *cp,
     bool packet_exists;
     paramIn(cp, section, base + ".packet_exists", packet_exists);
     if (packet_exists) {
-        packet = new EthPacketData(16384);
+        packet = make_shared<EthPacketData>(16384);
         packet->unserialize(base + ".packet", cp, section);
     }
 
@@ -273,7 +273,7 @@ LinkDelayEvent::unserialize(Checkpoint *cp, const string &section,
 
     link = parent->link[number];
 
-    packet = new EthPacketData(16384);
+    packet = make_shared<EthPacketData>(16384);
     packet->unserialize("packet", cp, section);
 }
 
index c71d9cc308c3cd06e341f96679309675aef5622c..16576d329e874db95afbc5eaf88346db6db6d9ba 100644 (file)
 #include <iosfwd>
 #include <memory>
 
-#include "base/refcnt.hh"
 #include "base/types.hh"
 
 /*
  * Reference counted class containing ethernet packet data
  */
 class Checkpoint;
-class EthPacketData : public RefCounted
+class EthPacketData
 {
   public:
     /*
@@ -81,6 +80,6 @@ class EthPacketData : public RefCounted
                      const std::string &section);
 };
 
-typedef RefCountingPtr<EthPacketData> EthPacketPtr;
+typedef std::shared_ptr<EthPacketData> EthPacketPtr;
 
 #endif // __ETHERPKT_HH__
index e14fd90c215aa361cd7cdf83b1ac8667f912ebf7..38ce4a2b343457c7fda88670c78d83f1d73291ce 100644 (file)
@@ -235,7 +235,7 @@ EtherTap::process(int revent)
 
     while (data_len != 0 && buffer_offset >= data_len + sizeof(uint32_t)) {
         EthPacketPtr packet;
-        packet = new EthPacketData(data_len);
+        packet = make_shared<EthPacketData>(data_len);
         packet->length = data_len;
         memcpy(packet->data, data, data_len);
 
index d86d7b4861c3c606f6dbe81980056b5f26af1d9e..af973476102542fcb03bd2b071766df2d2ad95a1 100644 (file)
@@ -41,6 +41,7 @@
  */
 
 #include <algorithm>
+#include <memory>
 
 #include "base/inet.hh"
 #include "base/trace.hh"
@@ -2147,7 +2148,7 @@ IGbE::txStateMachine()
     }
 
     if (!txPacket) {
-        txPacket = new EthPacketData(16384);
+        txPacket = std::make_shared<EthPacketData>(16384);
     }
 
     if (!txDescCache.packetWaiting()) {
@@ -2469,7 +2470,7 @@ IGbE::serialize(std::ostream &os)
     rxFifo.serialize("rxfifo", os);
     txFifo.serialize("txfifo", os);
 
-    bool txPktExists = txPacket;
+    bool txPktExists = txPacket != nullptr;
     SERIALIZE_SCALAR(txPktExists);
     if (txPktExists)
         txPacket->serialize("txpacket", os);
@@ -2526,7 +2527,7 @@ IGbE::unserialize(Checkpoint *cp, const std::string &section)
     bool txPktExists;
     UNSERIALIZE_SCALAR(txPktExists);
     if (txPktExists) {
-        txPacket = new EthPacketData(16384);
+        txPacket = std::make_shared<EthPacketData>(16384);
         txPacket->unserialize("txpacket", cp, section);
     }
 
index f180b0ecd08ba8d86f4d721c82c1fa0ce24430b7..239babe708b3e205e4728d99334b6f3429898830 100644 (file)
@@ -34,6 +34,7 @@
  * DP83820 ethernet controller.  Does not support priority queueing
  */
 #include <deque>
+#include <memory>
 #include <string>
 
 #include "base/debug.hh"
@@ -51,6 +52,7 @@
 
 // clang complains about std::set being overloaded with Packet::set if
 // we open up the entire namespace std
+using std::make_shared;
 using std::min;
 using std::ostream;
 using std::string;
@@ -1676,7 +1678,7 @@ NSGigE::txKick()
       case txFifoBlock:
         if (!txPacket) {
             DPRINTF(EthernetSM, "****starting the tx of a new packet****\n");
-            txPacket = new EthPacketData(16384);
+            txPacket = make_shared<EthPacketData>(16384);
             txPacketBufPtr = txPacket->data;
         }
 
@@ -2185,7 +2187,7 @@ NSGigE::serialize(ostream &os)
     /*
      * Serialize the various helper variables
      */
-    bool txPacketExists = txPacket;
+    bool txPacketExists = txPacket != nullptr;
     SERIALIZE_SCALAR(txPacketExists);
     if (txPacketExists) {
         txPacket->length = txPacketBufPtr - txPacket->data;
@@ -2194,7 +2196,7 @@ NSGigE::serialize(ostream &os)
         SERIALIZE_SCALAR(txPktBufPtr);
     }
 
-    bool rxPacketExists = rxPacket;
+    bool rxPacketExists = rxPacket != nullptr;
     SERIALIZE_SCALAR(rxPacketExists);
     if (rxPacketExists) {
         rxPacket->serialize("rxPacket", os);
@@ -2352,7 +2354,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string &section)
     bool txPacketExists;
     UNSERIALIZE_SCALAR(txPacketExists);
     if (txPacketExists) {
-        txPacket = new EthPacketData(16384);
+        txPacket = make_shared<EthPacketData>(16384);
         txPacket->unserialize("txPacket", cp, section);
         uint32_t txPktBufPtr;
         UNSERIALIZE_SCALAR(txPktBufPtr);
@@ -2364,7 +2366,7 @@ NSGigE::unserialize(Checkpoint *cp, const std::string &section)
     UNSERIALIZE_SCALAR(rxPacketExists);
     rxPacket = 0;
     if (rxPacketExists) {
-        rxPacket = new EthPacketData(16384);
+        rxPacket = make_shared<EthPacketData>(16384);
         rxPacket->unserialize("rxPacket", cp, section);
         uint32_t rxPktBufPtr;
         UNSERIALIZE_SCALAR(rxPktBufPtr);
index e5d67d5ec1ab452fb85171ec944126683e45b262..efd8b083da857552ee5b1848a5acf5b7516ac29b 100644 (file)
@@ -77,7 +77,7 @@ void
 PacketFifoEntry::unserialize(const string &base, Checkpoint *cp,
                              const string &section)
 {
-    packet = new EthPacketData(16384);
+    packet = make_shared<EthPacketData>(16384);
     packet->unserialize(base + ".packet", cp, section);
     paramIn(cp, section, base + ".slack", slack);
     paramIn(cp, section, base + ".number", number);
index 7da70c482f9d79e4e1b4aa82ed220b35ecf3b108..798fb17ef7eb9724003ff7be958c86bf62aebf7f 100644 (file)
@@ -1056,7 +1056,7 @@ Device::txKick()
         assert(Regs::get_TxDone_Busy(vnic->TxDone));
         if (!txPacket) {
             // Grab a new packet from the fifo.
-            txPacket = new EthPacketData(16384);
+            txPacket = make_shared<EthPacketData>(16384);
             txPacketOffset = 0;
         }
 
@@ -1403,7 +1403,7 @@ Device::serialize(std::ostream &os)
     SERIALIZE_SCALAR(txState);
     SERIALIZE_SCALAR(txFull);
     txFifo.serialize("txFifo", os);
-    bool txPacketExists = txPacket;
+    bool txPacketExists = txPacket != nullptr;
     SERIALIZE_SCALAR(txPacketExists);
     if (txPacketExists) {
         txPacket->serialize("txPacket", os);
@@ -1498,7 +1498,7 @@ Device::unserialize(Checkpoint *cp, const std::string &section)
     UNSERIALIZE_SCALAR(txPacketExists);
     txPacket = 0;
     if (txPacketExists) {
-        txPacket = new EthPacketData(16384);
+        txPacket = make_shared<EthPacketData>(16384);
         txPacket->unserialize("txPacket", cp, section);
         UNSERIALIZE_SCALAR(txPacketOffset);
         UNSERIALIZE_SCALAR(txPacketBytes);