diff options
author | Jordi Vaquero <jordi.vaquero@metempsy.com> | 2019-09-11 00:11:27 +0200 |
---|---|---|
committer | Jordi Vaquero <jordi.vaquero@metempsy.com> | 2019-09-23 12:32:08 +0000 |
commit | e5a82da26e29560f3e7121b600a12f8acd6a5a3f (patch) | |
tree | 31786646cd8b077b48381303d0352959038e15a2 /src/cpu/simple | |
parent | a56ab04598be184427e8dd71fa5528b016738306 (diff) | |
download | gem5-e5a82da26e29560f3e7121b600a12f8acd6a5a3f.tar.xz |
cpu, mem: Changing AtomicOpFunctor* for unique_ptr<AtomicOpFunctor>
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<AtomicOpFunctor> 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 <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/cpu/simple')
-rw-r--r-- | src/cpu/simple/atomic.cc | 4 | ||||
-rw-r--r-- | src/cpu/simple/atomic.hh | 2 | ||||
-rw-r--r-- | src/cpu/simple/base.hh | 4 | ||||
-rw-r--r-- | src/cpu/simple/exec_context.hh | 8 | ||||
-rw-r--r-- | src/cpu/simple/timing.cc | 5 | ||||
-rw-r--r-- | src/cpu/simple/timing.hh | 2 |
6 files changed, 13 insertions, 12 deletions
diff --git a/src/cpu/simple/atomic.cc b/src/cpu/simple/atomic.cc index a873e6de7..9052cee2e 100644 --- a/src/cpu/simple/atomic.cc +++ b/src/cpu/simple/atomic.cc @@ -566,7 +566,7 @@ AtomicSimpleCPU::writeMem(uint8_t *data, unsigned size, Addr addr, Fault AtomicSimpleCPU::amoMem(Addr addr, uint8_t* data, unsigned size, - Request::Flags flags, AtomicOpFunctor *amo_op) + Request::Flags flags, AtomicOpFunctorPtr amo_op) { SimpleExecContext& t_info = *threadInfo[curThread]; SimpleThread* thread = t_info.thread; @@ -596,7 +596,7 @@ AtomicSimpleCPU::amoMem(Addr addr, uint8_t* data, unsigned size, req->taskId(taskId()); req->setVirt(0, addr, size, flags, dataMasterId(), - thread->pcState().instAddr(), amo_op); + thread->pcState().instAddr(), std::move(amo_op)); // translate to physical address Fault fault = thread->dtb->translateAtomic(req, thread->getTC(), diff --git a/src/cpu/simple/atomic.hh b/src/cpu/simple/atomic.hh index 69ac09e4c..121cecd65 100644 --- a/src/cpu/simple/atomic.hh +++ b/src/cpu/simple/atomic.hh @@ -227,7 +227,7 @@ class AtomicSimpleCPU : public BaseSimpleCPU override; Fault amoMem(Addr addr, uint8_t* data, unsigned size, - Request::Flags flags, AtomicOpFunctor *amo_op) override; + Request::Flags flags, AtomicOpFunctorPtr amo_op) override; void regProbePoints() override; diff --git a/src/cpu/simple/base.hh b/src/cpu/simple/base.hh index 5404e5df8..f8e534c85 100644 --- a/src/cpu/simple/base.hh +++ b/src/cpu/simple/base.hh @@ -162,12 +162,12 @@ class BaseSimpleCPU : public BaseCPU virtual Fault amoMem(Addr addr, uint8_t* data, unsigned size, Request::Flags flags, - AtomicOpFunctor *amo_op) + AtomicOpFunctorPtr amo_op) { panic("amoMem() is not implemented\n"); } virtual Fault initiateMemAMO(Addr addr, unsigned size, Request::Flags flags, - AtomicOpFunctor *amo_op) + AtomicOpFunctorPtr amo_op) { panic("initiateMemAMO() is not implemented\n"); } void countInst(); diff --git a/src/cpu/simple/exec_context.hh b/src/cpu/simple/exec_context.hh index de98d6efd..91f7ec526 100644 --- a/src/cpu/simple/exec_context.hh +++ b/src/cpu/simple/exec_context.hh @@ -463,16 +463,16 @@ class SimpleExecContext : public ExecContext { } Fault amoMem(Addr addr, uint8_t *data, unsigned int size, - Request::Flags flags, AtomicOpFunctor *amo_op) override + Request::Flags flags, AtomicOpFunctorPtr amo_op) override { - return cpu->amoMem(addr, data, size, flags, amo_op); + return cpu->amoMem(addr, data, size, flags, std::move(amo_op)); } Fault initiateMemAMO(Addr addr, unsigned int size, Request::Flags flags, - AtomicOpFunctor *amo_op) override + AtomicOpFunctorPtr amo_op) override { - return cpu->initiateMemAMO(addr, size, flags, amo_op); + return cpu->initiateMemAMO(addr, size, flags, std::move(amo_op)); } /** diff --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc index 4aa008e33..d05eece27 100644 --- a/src/cpu/simple/timing.cc +++ b/src/cpu/simple/timing.cc @@ -564,7 +564,7 @@ TimingSimpleCPU::writeMem(uint8_t *data, unsigned size, Fault TimingSimpleCPU::initiateMemAMO(Addr addr, unsigned size, Request::Flags flags, - AtomicOpFunctor *amo_op) + AtomicOpFunctorPtr amo_op) { SimpleExecContext &t_info = *threadInfo[curThread]; SimpleThread* thread = t_info.thread; @@ -579,7 +579,8 @@ TimingSimpleCPU::initiateMemAMO(Addr addr, unsigned size, traceData->setMem(addr, size, flags); RequestPtr req = make_shared<Request>(asid, addr, size, flags, - dataMasterId(), pc, thread->contextId(), amo_op); + dataMasterId(), pc, thread->contextId(), + std::move(amo_op)); assert(req->hasAtomicOpFunctor()); diff --git a/src/cpu/simple/timing.hh b/src/cpu/simple/timing.hh index 53e0ed7e1..27faa177a 100644 --- a/src/cpu/simple/timing.hh +++ b/src/cpu/simple/timing.hh @@ -293,7 +293,7 @@ class TimingSimpleCPU : public BaseSimpleCPU override; Fault initiateMemAMO(Addr addr, unsigned size, Request::Flags flags, - AtomicOpFunctor *amo_op) override; + AtomicOpFunctorPtr amo_op) override; void fetch(); void sendFetch(const Fault &fault, |