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