From e5a82da26e29560f3e7121b600a12f8acd6a5a3f Mon Sep 17 00:00:00 2001 From: Jordi Vaquero Date: Wed, 11 Sep 2019 00:11:27 +0200 Subject: cpu, mem: Changing AtomicOpFunctor* for unique_ptr This change is based on modify the way we move the AtomicOpFunctor* through gem5 in order to mantain proper ownership of the object and ensuring its destruction when it is no longer used. Doing that we fix at the same time a memory leak in Request.hh where we were assigning a new AtomicOpFunctor* without destroying the previous one. This change creates a new type AtomicOpFunctor_ptr as a std::unique_ptr and move its ownership as needed. Except for its only usage when AtomicOpFunc() is called. Change-Id: Ic516f9d8217cb1ae1f0a19500e5da0336da9fd4f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20919 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg Tested-by: kokoro --- src/cpu/minor/exec_context.hh | 4 ++-- src/cpu/minor/lsq.cc | 4 ++-- src/cpu/minor/lsq.hh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src/cpu/minor') diff --git a/src/cpu/minor/exec_context.hh b/src/cpu/minor/exec_context.hh index 1871e2479..87787f011 100644 --- a/src/cpu/minor/exec_context.hh +++ b/src/cpu/minor/exec_context.hh @@ -133,11 +133,11 @@ class ExecContext : public ::ExecContext Fault initiateMemAMO(Addr addr, unsigned int size, Request::Flags flags, - AtomicOpFunctor *amo_op) override + AtomicOpFunctorPtr amo_op) override { // AMO requests are pushed through the store path return execute.getLSQ().pushRequest(inst, false /* amo */, nullptr, - size, addr, flags, nullptr, amo_op); + size, addr, flags, nullptr, std::move(amo_op)); } RegVal diff --git a/src/cpu/minor/lsq.cc b/src/cpu/minor/lsq.cc index 1e5e89647..629d89dc6 100644 --- a/src/cpu/minor/lsq.cc +++ b/src/cpu/minor/lsq.cc @@ -1573,7 +1573,7 @@ LSQ::needsToTick() Fault LSQ::pushRequest(MinorDynInstPtr inst, bool isLoad, uint8_t *data, unsigned int size, Addr addr, Request::Flags flags, - uint64_t *res, AtomicOpFunctor *amo_op, + uint64_t *res, AtomicOpFunctorPtr amo_op, const std::vector& byteEnable) { assert(inst->translationFault == NoFault || inst->inLSQ); @@ -1635,7 +1635,7 @@ LSQ::pushRequest(MinorDynInstPtr inst, bool isLoad, uint8_t *data, request->request->setVirt(0 /* asid */, addr, size, flags, cpu.dataMasterId(), /* I've no idea why we need the PC, but give it */ - inst->pc.instAddr(), amo_op); + inst->pc.instAddr(), std::move(amo_op)); request->request->setByteEnable(byteEnable); requests.push(request); diff --git a/src/cpu/minor/lsq.hh b/src/cpu/minor/lsq.hh index a7c7cb632..c4baad826 100644 --- a/src/cpu/minor/lsq.hh +++ b/src/cpu/minor/lsq.hh @@ -708,7 +708,7 @@ class LSQ : public Named * the LSQ */ Fault pushRequest(MinorDynInstPtr inst, bool isLoad, uint8_t *data, unsigned int size, Addr addr, Request::Flags flags, - uint64_t *res, AtomicOpFunctor *amo_op, + uint64_t *res, AtomicOpFunctorPtr amo_op, const std::vector& byteEnable = std::vector()); -- cgit v1.2.3