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.
This commit is contained in:
Andreas Hansson 2014-12-02 06:07:43 -05:00
parent 5df96cb690
commit 41846cb61b
10 changed files with 21 additions and 42 deletions

View file

@ -1558,7 +1558,7 @@ makePacketForRequest(Request &request, bool isLoad,
if (isLoad) if (isLoad)
ret->allocate(); ret->allocate();
else else
ret->dataDynamicArray(data); ret->dataDynamic(data);
return ret; return ret;
} }

View file

@ -669,7 +669,7 @@ DefaultFetch<Impl>::finishTranslation(const Fault &fault, RequestPtr mem_req)
// Build packet here. // Build packet here.
PacketPtr data_pkt = new Packet(mem_req, MemCmd::ReadReq); 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; fetchBufferPC[tid] = fetchBufferBlockPC;
fetchBufferValid[tid] = false; fetchBufferValid[tid] = false;

View file

@ -271,7 +271,7 @@ TimingSimpleCPU::sendData(RequestPtr req, uint8_t *data, uint64_t *res,
{ {
PacketPtr pkt; PacketPtr pkt;
buildPacket(pkt, req, read); buildPacket(pkt, req, read);
pkt->dataDynamicArray<uint8_t>(data); pkt->dataDynamic<uint8_t>(data);
if (req->getFlags().isSet(Request::NO_ACCESS)) { if (req->getFlags().isSet(Request::NO_ACCESS)) {
assert(!dcache_pkt); assert(!dcache_pkt);
pkt->makeResponse(); pkt->makeResponse();
@ -379,7 +379,7 @@ TimingSimpleCPU::buildSplitPacket(PacketPtr &pkt1, PacketPtr &pkt2,
req->setPhys(req1->getPaddr(), req->getSize(), req1->getFlags(), dataMasterId()); req->setPhys(req1->getPaddr(), req->getSize(), req1->getFlags(), dataMasterId());
PacketPtr pkt = new Packet(req, pkt1->cmd.responseCommand()); PacketPtr pkt = new Packet(req, pkt1->cmd.responseCommand());
pkt->dataDynamicArray<uint8_t>(data); pkt->dataDynamic<uint8_t>(data);
pkt1->dataStatic<uint8_t>(data); pkt1->dataStatic<uint8_t>(data);
pkt2->dataStatic<uint8_t>(data + req1->getSize()); pkt2->dataStatic<uint8_t>(data + req1->getSize());

View file

@ -76,9 +76,7 @@ InvalidateGenerator::initiate()
} else { } else {
panic("initiate was unexpectedly called\n"); panic("initiate was unexpectedly called\n");
} }
uint8_t* dummyData = new uint8_t; pkt->allocate();
*dummyData = 0;
pkt->dataDynamic(dummyData);
if (port->sendTimingReq(pkt)) { if (port->sendTimingReq(pkt)) {
DPRINTF(DirectedTest, "initiating request - successful\n"); DPRINTF(DirectedTest, "initiating request - successful\n");

View file

@ -69,9 +69,7 @@ SeriesRequestGenerator::initiate()
} }
PacketPtr pkt = new Packet(req, cmd); PacketPtr pkt = new Packet(req, cmd);
uint8_t* dummyData = new uint8_t; pkt->allocate();
*dummyData = 0;
pkt->dataDynamic(dummyData);
if (port->sendTimingReq(pkt)) { if (port->sendTimingReq(pkt)) {
DPRINTF(DirectedTest, "initiating request - successful\n"); DPRINTF(DirectedTest, "initiating request - successful\n");

View file

@ -327,7 +327,7 @@ MemTest::tick()
blockAddr(req->getPaddr()), *result); blockAddr(req->getPaddr()), *result);
PacketPtr pkt = new Packet(req, MemCmd::ReadReq); 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); MemTestSenderState *state = new MemTestSenderState(result);
pkt->senderState = state; pkt->senderState = state;
@ -349,7 +349,7 @@ MemTest::tick()
PacketPtr pkt = new Packet(req, MemCmd::WriteReq); PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
uint8_t *pkt_data = new uint8_t[req->getSize()]; uint8_t *pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data); pkt->dataDynamic(pkt_data);
memcpy(pkt_data, &data, req->getSize()); memcpy(pkt_data, &data, req->getSize());
MemTestSenderState *state = new MemTestSenderState(result); MemTestSenderState *state = new MemTestSenderState(result);
pkt->senderState = state; pkt->senderState = state;

View file

@ -261,7 +261,7 @@ NetworkTest::generatePkt()
destination, req->getPaddr()); destination, req->getPaddr());
PacketPtr pkt = new Packet(req, requestType); PacketPtr pkt = new Packet(req, requestType);
pkt->dataDynamicArray(new uint8_t[req->getSize()]); pkt->dataDynamic(new uint8_t[req->getSize()]);
pkt->senderState = NULL; pkt->senderState = NULL;
sendPkt(pkt); sendPkt(pkt);

View file

@ -113,7 +113,7 @@ Check::initiatePrefetch()
// despite the oddity of the 0 size (questionable if this should // despite the oddity of the 0 size (questionable if this should
// even be allowed), a prefetch is still a read and as such needs // even be allowed), a prefetch is still a read and as such needs
// a place to store the result // a place to store the result
uint8_t *data = new uint8_t; uint8_t *data = new uint8_t[1];
pkt->dataDynamic(data); pkt->dataDynamic(data);
// push the subblock onto the sender state. The sequencer will // push the subblock onto the sender state. The sequencer will
@ -192,7 +192,7 @@ Check::initiateAction()
// } // }
PacketPtr pkt = new Packet(req, cmd); 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; *writeData = m_value + m_store_count;
pkt->dataDynamic(writeData); pkt->dataDynamic(writeData);
@ -246,7 +246,7 @@ Check::initiateCheck()
req->setThreadContext(index, 0); req->setThreadContext(index, 0);
PacketPtr pkt = new Packet(req, MemCmd::ReadReq); PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
uint8_t *dataArray = new uint8_t[CHECK_SIZE]; uint8_t *dataArray = new uint8_t[CHECK_SIZE];
pkt->dataDynamicArray(dataArray); pkt->dataDynamic(dataArray);
// push the subblock onto the sender state. The sequencer will // push the subblock onto the sender state. The sequencer will
// update the subblock on the return // update the subblock on the return

View file

@ -62,7 +62,7 @@ BaseGen::getPacket(Addr addr, unsigned size, const MemCmd& cmd,
PacketPtr pkt = new Packet(req, cmd); PacketPtr pkt = new Packet(req, cmd);
uint8_t* pkt_data = new uint8_t[req->getSize()]; uint8_t* pkt_data = new uint8_t[req->getSize()];
pkt->dataDynamicArray(pkt_data); pkt->dataDynamic(pkt_data);
if (cmd.isWrite()) { if (cmd.isWrite()) {
memset(pkt_data, 0xA, req->getSize()); memset(pkt_data, 0xA, req->getSize());

View file

@ -247,11 +247,9 @@ class Packet : public Printable
/// when the packet is destroyed? /// when the packet is destroyed?
static const FlagsType STATIC_DATA = 0x00001000; static const FlagsType STATIC_DATA = 0x00001000;
/// The data pointer points to a value that should be freed when /// 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; 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 /// suppress the error if this packet encounters a functional
/// access failure. /// access failure.
static const FlagsType SUPPRESS_FUNC_ERROR = 0x00008000; static const FlagsType SUPPRESS_FUNC_ERROR = 0x00008000;
@ -813,7 +811,7 @@ class Packet : public Printable
void void
dataStatic(T *p) dataStatic(T *p)
{ {
assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA)); assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
data = (PacketDataPtr)p; data = (PacketDataPtr)p;
flags.set(STATIC_DATA); flags.set(STATIC_DATA);
} }
@ -830,7 +828,7 @@ class Packet : public Printable
void void
dataStaticConst(const T *p) 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); data = const_cast<PacketDataPtr>(p);
flags.set(STATIC_DATA); flags.set(STATIC_DATA);
} }
@ -841,22 +839,9 @@ class Packet : public Printable
*/ */
template <typename T> template <typename T>
void 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) dataDynamic(T *p)
{ {
assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA|ARRAY_DATA)); assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
data = (PacketDataPtr)p; data = (PacketDataPtr)p;
flags.set(DYNAMIC_DATA); flags.set(DYNAMIC_DATA);
} }
@ -938,12 +923,10 @@ class Packet : public Printable
void void
deleteData() deleteData()
{ {
if (flags.isSet(ARRAY_DATA)) if (flags.isSet(DYNAMIC_DATA))
delete [] 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; data = NULL;
} }
@ -952,7 +935,7 @@ class Packet : public Printable
allocate() allocate()
{ {
assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA)); assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
flags.set(DYNAMIC_DATA|ARRAY_DATA); flags.set(DYNAMIC_DATA);
data = new uint8_t[getSize()]; data = new uint8_t[getSize()];
} }