From: Andreas Hansson Date: Tue, 2 Dec 2014 11:07:43 +0000 (-0500) Subject: mem: Assume all dynamic packet data is array allocated X-Git-Tag: stable_2015_04_15~101 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=41846cb61b0f511099eb9a203f11885de328ab45;p=gem5.git 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. --- diff --git a/src/cpu/minor/lsq.cc b/src/cpu/minor/lsq.cc index fca580085..75dbb804a 100644 --- a/src/cpu/minor/lsq.cc +++ b/src/cpu/minor/lsq.cc @@ -1558,7 +1558,7 @@ makePacketForRequest(Request &request, bool isLoad, if (isLoad) ret->allocate(); else - ret->dataDynamicArray(data); + ret->dataDynamic(data); return ret; } diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index 47a64a9bf..d3b0b3ac5 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -669,7 +669,7 @@ DefaultFetch::finishTranslation(const Fault &fault, RequestPtr mem_req) // 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 --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc index 2d0ab330e..c2bcdee63 100644 --- a/src/cpu/simple/timing.cc +++ b/src/cpu/simple/timing.cc @@ -271,7 +271,7 @@ TimingSimpleCPU::sendData(RequestPtr req, uint8_t *data, uint64_t *res, { PacketPtr pkt; buildPacket(pkt, req, read); - pkt->dataDynamicArray(data); + pkt->dataDynamic(data); if (req->getFlags().isSet(Request::NO_ACCESS)) { assert(!dcache_pkt); pkt->makeResponse(); @@ -379,7 +379,7 @@ TimingSimpleCPU::buildSplitPacket(PacketPtr &pkt1, PacketPtr &pkt2, req->setPhys(req1->getPaddr(), req->getSize(), req1->getFlags(), dataMasterId()); PacketPtr pkt = new Packet(req, pkt1->cmd.responseCommand()); - pkt->dataDynamicArray(data); + pkt->dataDynamic(data); pkt1->dataStatic(data); pkt2->dataStatic(data + req1->getSize()); diff --git a/src/cpu/testers/directedtest/InvalidateGenerator.cc b/src/cpu/testers/directedtest/InvalidateGenerator.cc index 84a90844f..61c3f5972 100644 --- a/src/cpu/testers/directedtest/InvalidateGenerator.cc +++ b/src/cpu/testers/directedtest/InvalidateGenerator.cc @@ -76,9 +76,7 @@ InvalidateGenerator::initiate() } 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 --git a/src/cpu/testers/directedtest/SeriesRequestGenerator.cc b/src/cpu/testers/directedtest/SeriesRequestGenerator.cc index 80523280b..2356fb47a 100644 --- a/src/cpu/testers/directedtest/SeriesRequestGenerator.cc +++ b/src/cpu/testers/directedtest/SeriesRequestGenerator.cc @@ -69,9 +69,7 @@ SeriesRequestGenerator::initiate() } 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 --git a/src/cpu/testers/memtest/memtest.cc b/src/cpu/testers/memtest/memtest.cc index 082737f8a..53c01b7f7 100644 --- a/src/cpu/testers/memtest/memtest.cc +++ b/src/cpu/testers/memtest/memtest.cc @@ -327,7 +327,7 @@ MemTest::tick() 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 @@ MemTest::tick() 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 --git a/src/cpu/testers/networktest/networktest.cc b/src/cpu/testers/networktest/networktest.cc index 94dedf648..8ad32d140 100644 --- a/src/cpu/testers/networktest/networktest.cc +++ b/src/cpu/testers/networktest/networktest.cc @@ -261,7 +261,7 @@ NetworkTest::generatePkt() 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 --git a/src/cpu/testers/rubytest/Check.cc b/src/cpu/testers/rubytest/Check.cc index 19d0623c0..b320ca61d 100644 --- a/src/cpu/testers/rubytest/Check.cc +++ b/src/cpu/testers/rubytest/Check.cc @@ -113,7 +113,7 @@ Check::initiatePrefetch() // 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 @@ Check::initiateAction() // } 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 @@ Check::initiateCheck() 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 --git a/src/cpu/testers/traffic_gen/generators.cc b/src/cpu/testers/traffic_gen/generators.cc index 5e19384bc..f0cf14206 100644 --- a/src/cpu/testers/traffic_gen/generators.cc +++ b/src/cpu/testers/traffic_gen/generators.cc @@ -62,7 +62,7 @@ BaseGen::getPacket(Addr addr, unsigned size, const MemCmd& cmd, 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 --git a/src/mem/packet.hh b/src/mem/packet.hh index e8fb00680..19423db58 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -247,11 +247,9 @@ class Packet : public Printable /// 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 @@ class Packet : public Printable 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 @@ class Packet : public Printable void dataStaticConst(const T *p) { - assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA)); + assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); data = const_cast(p); flags.set(STATIC_DATA); } @@ -841,22 +839,9 @@ class Packet : public Printable */ template 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 - 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 @@ class Packet : public Printable 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 @@ class Packet : public Printable allocate() { assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); - flags.set(DYNAMIC_DATA|ARRAY_DATA); + flags.set(DYNAMIC_DATA); data = new uint8_t[getSize()]; }