changeset c99c8d2a7c31 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=c99c8d2a7c31
description:
        mem: Assume all dynamic packet data is array allocated

        This patch simplifies how we deal with dynamically allocated data in
        the packet, always assuming that it is array allocated, and hence
        should be array deallocated (delete[] as opposed to delete). The only
        uses of dataDynamic was in the Ruby testers.

        The ARRAY_DATA flag in the packet is removed accordingly. No
        defragmentation of the flags is done at this point, leaving a gap in
        the bit masks.

        As the last part the patch, it renames dataDynamicArray to dataDynamic.

diffstat:

 src/cpu/minor/lsq.cc                                   |   2 +-
 src/cpu/o3/fetch_impl.hh                               |   2 +-
 src/cpu/simple/timing.cc                               |   4 +-
 src/cpu/testers/directedtest/InvalidateGenerator.cc    |   4 +-
 src/cpu/testers/directedtest/SeriesRequestGenerator.cc |   4 +-
 src/cpu/testers/memtest/memtest.cc                     |   4 +-
 src/cpu/testers/networktest/networktest.cc             |   2 +-
 src/cpu/testers/rubytest/Check.cc                      |   6 +-
 src/cpu/testers/traffic_gen/generators.cc              |   2 +-
 src/mem/packet.hh                                      |  33 ++++-------------
 10 files changed, 21 insertions(+), 42 deletions(-)

diffs (231 lines):

diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/minor/lsq.cc
--- a/src/cpu/minor/lsq.cc      Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/minor/lsq.cc      Tue Dec 02 06:07:43 2014 -0500
@@ -1558,7 +1558,7 @@
     if (isLoad)
         ret->allocate();
     else
-        ret->dataDynamicArray(data);
+        ret->dataDynamic(data);
 
     return ret;
 }
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/o3/fetch_impl.hh
--- a/src/cpu/o3/fetch_impl.hh  Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/o3/fetch_impl.hh  Tue Dec 02 06:07:43 2014 -0500
@@ -669,7 +669,7 @@
 
         // Build packet here.
         PacketPtr data_pkt = new Packet(mem_req, MemCmd::ReadReq);
-        data_pkt->dataDynamicArray(new uint8_t[fetchBufferSize]);
+        data_pkt->dataDynamic(new uint8_t[fetchBufferSize]);
 
         fetchBufferPC[tid] = fetchBufferBlockPC;
         fetchBufferValid[tid] = false;
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/simple/timing.cc
--- a/src/cpu/simple/timing.cc  Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/simple/timing.cc  Tue Dec 02 06:07:43 2014 -0500
@@ -271,7 +271,7 @@
 {
     PacketPtr pkt;
     buildPacket(pkt, req, read);
-    pkt->dataDynamicArray<uint8_t>(data);
+    pkt->dataDynamic<uint8_t>(data);
     if (req->getFlags().isSet(Request::NO_ACCESS)) {
         assert(!dcache_pkt);
         pkt->makeResponse();
@@ -379,7 +379,7 @@
     req->setPhys(req1->getPaddr(), req->getSize(), req1->getFlags(), 
dataMasterId());
     PacketPtr pkt = new Packet(req, pkt1->cmd.responseCommand());
 
-    pkt->dataDynamicArray<uint8_t>(data);
+    pkt->dataDynamic<uint8_t>(data);
     pkt1->dataStatic<uint8_t>(data);
     pkt2->dataStatic<uint8_t>(data + req1->getSize());
 
diff -r 23593fdaadcd -r c99c8d2a7c31 
src/cpu/testers/directedtest/InvalidateGenerator.cc
--- a/src/cpu/testers/directedtest/InvalidateGenerator.cc       Tue Dec 02 
06:07:41 2014 -0500
+++ b/src/cpu/testers/directedtest/InvalidateGenerator.cc       Tue Dec 02 
06:07:43 2014 -0500
@@ -76,9 +76,7 @@
     } else {
         panic("initiate was unexpectedly called\n");
     }
-    uint8_t* dummyData = new uint8_t;
-    *dummyData = 0;
-    pkt->dataDynamic(dummyData);
+    pkt->allocate();
 
     if (port->sendTimingReq(pkt)) {
         DPRINTF(DirectedTest, "initiating request - successful\n");
diff -r 23593fdaadcd -r c99c8d2a7c31 
src/cpu/testers/directedtest/SeriesRequestGenerator.cc
--- a/src/cpu/testers/directedtest/SeriesRequestGenerator.cc    Tue Dec 02 
06:07:41 2014 -0500
+++ b/src/cpu/testers/directedtest/SeriesRequestGenerator.cc    Tue Dec 02 
06:07:43 2014 -0500
@@ -69,9 +69,7 @@
     }
 
     PacketPtr pkt = new Packet(req, cmd);
-    uint8_t* dummyData = new uint8_t;
-    *dummyData = 0;
-    pkt->dataDynamic(dummyData);
+    pkt->allocate();
 
     if (port->sendTimingReq(pkt)) {
         DPRINTF(DirectedTest, "initiating request - successful\n");
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/testers/memtest/memtest.cc
--- a/src/cpu/testers/memtest/memtest.cc        Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/testers/memtest/memtest.cc        Tue Dec 02 06:07:43 2014 -0500
@@ -327,7 +327,7 @@
                 blockAddr(req->getPaddr()), *result);
 
         PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
-        pkt->dataDynamicArray(new uint8_t[req->getSize()]);
+        pkt->dataDynamic(new uint8_t[req->getSize()]);
         MemTestSenderState *state = new MemTestSenderState(result);
         pkt->senderState = state;
 
@@ -349,7 +349,7 @@
 
         PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
         uint8_t *pkt_data = new uint8_t[req->getSize()];
-        pkt->dataDynamicArray(pkt_data);
+        pkt->dataDynamic(pkt_data);
         memcpy(pkt_data, &data, req->getSize());
         MemTestSenderState *state = new MemTestSenderState(result);
         pkt->senderState = state;
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/testers/networktest/networktest.cc
--- a/src/cpu/testers/networktest/networktest.cc        Tue Dec 02 06:07:41 
2014 -0500
+++ b/src/cpu/testers/networktest/networktest.cc        Tue Dec 02 06:07:43 
2014 -0500
@@ -261,7 +261,7 @@
             destination, req->getPaddr());
 
     PacketPtr pkt = new Packet(req, requestType);
-    pkt->dataDynamicArray(new uint8_t[req->getSize()]);
+    pkt->dataDynamic(new uint8_t[req->getSize()]);
     pkt->senderState = NULL;
 
     sendPkt(pkt);
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/testers/rubytest/Check.cc
--- a/src/cpu/testers/rubytest/Check.cc Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/testers/rubytest/Check.cc Tue Dec 02 06:07:43 2014 -0500
@@ -113,7 +113,7 @@
     // despite the oddity of the 0 size (questionable if this should
     // even be allowed), a prefetch is still a read and as such needs
     // a place to store the result
-    uint8_t *data = new uint8_t;
+    uint8_t *data = new uint8_t[1];
     pkt->dataDynamic(data);
 
     // push the subblock onto the sender state.  The sequencer will
@@ -192,7 +192,7 @@
     // }
 
     PacketPtr pkt = new Packet(req, cmd);
-    uint8_t *writeData = new uint8_t;
+    uint8_t *writeData = new uint8_t[1];
     *writeData = m_value + m_store_count;
     pkt->dataDynamic(writeData);
 
@@ -246,7 +246,7 @@
     req->setThreadContext(index, 0);
     PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
     uint8_t *dataArray = new uint8_t[CHECK_SIZE];
-    pkt->dataDynamicArray(dataArray);
+    pkt->dataDynamic(dataArray);
 
     // push the subblock onto the sender state.  The sequencer will
     // update the subblock on the return
diff -r 23593fdaadcd -r c99c8d2a7c31 src/cpu/testers/traffic_gen/generators.cc
--- a/src/cpu/testers/traffic_gen/generators.cc Tue Dec 02 06:07:41 2014 -0500
+++ b/src/cpu/testers/traffic_gen/generators.cc Tue Dec 02 06:07:43 2014 -0500
@@ -62,7 +62,7 @@
     PacketPtr pkt = new Packet(req, cmd);
 
     uint8_t* pkt_data = new uint8_t[req->getSize()];
-    pkt->dataDynamicArray(pkt_data);
+    pkt->dataDynamic(pkt_data);
 
     if (cmd.isWrite()) {
         memset(pkt_data, 0xA, req->getSize());
diff -r 23593fdaadcd -r c99c8d2a7c31 src/mem/packet.hh
--- a/src/mem/packet.hh Tue Dec 02 06:07:41 2014 -0500
+++ b/src/mem/packet.hh Tue Dec 02 06:07:43 2014 -0500
@@ -247,11 +247,9 @@
     /// when the packet is destroyed?
     static const FlagsType STATIC_DATA            = 0x00001000;
     /// The data pointer points to a value that should be freed when
-    /// the packet is destroyed.
+    /// the packet is destroyed. The pointer is assumed to be pointing
+    /// to an array, and delete [] is consequently called
     static const FlagsType DYNAMIC_DATA           = 0x00002000;
-    /// the data pointer points to an array (thus delete []) needs to
-    /// be called on it rather than simply delete.
-    static const FlagsType ARRAY_DATA             = 0x00004000;
     /// suppress the error if this packet encounters a functional
     /// access failure.
     static const FlagsType SUPPRESS_FUNC_ERROR    = 0x00008000;
@@ -813,7 +811,7 @@
     void
     dataStatic(T *p)
     {
-        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA));
+        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
         data = (PacketDataPtr)p;
         flags.set(STATIC_DATA);
     }
@@ -830,7 +828,7 @@
     void
     dataStaticConst(const T *p)
     {
-        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA));
+        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
         data = const_cast<PacketDataPtr>(p);
         flags.set(STATIC_DATA);
     }
@@ -841,22 +839,9 @@
      */
     template <typename T>
     void
-    dataDynamicArray(T *p)
-    {
-        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA));
-        data = (PacketDataPtr)p;
-        flags.set(DYNAMIC_DATA|ARRAY_DATA);
-    }
-
-    /**
-     * set the data pointer to a value that should have delete called
-     * on it.
-     */
-    template <typename T>
-    void
     dataDynamic(T *p)
     {
-        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA));
+        assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
         data = (PacketDataPtr)p;
         flags.set(DYNAMIC_DATA);
     }
@@ -938,12 +923,10 @@
     void
     deleteData()
     {
-        if (flags.isSet(ARRAY_DATA))
+        if (flags.isSet(DYNAMIC_DATA))
             delete [] data;
-        else if (flags.isSet(DYNAMIC_DATA))
-            delete data;
 
-        flags.clear(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA);
+        flags.clear(STATIC_DATA|DYNAMIC_DATA);
         data = NULL;
     }
 
@@ -952,7 +935,7 @@
     allocate()
     {
         assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
-        flags.set(DYNAMIC_DATA|ARRAY_DATA);
+        flags.set(DYNAMIC_DATA);
         data = new uint8_t[getSize()];
     }
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to