Earl Ou has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/67236?usp=email )

Change subject: systemc: fix warning of auto event deletion
......................................................................

systemc: fix warning of auto event deletion

We see the following warning in systemc Scheduler:

eventq.hh: warning: operator delete called on unallocated object
scheduler [-Wfree-nonheap-object]

This is because Event has auto deletion feature and is wrapped
into EventWrapper. The additional Flag layer in EventWrapper
makes it difficult for compiler to tell if the Event can delete
itself or not. And Scheduler put Event in stack instead of heap.

This CL moves them from stack to heap to avoid the warning. The
proper longer term fix is probably by removing the auto delete
feature, and use smart pointer to explicitly transfer ownership
to the event queue.

Change-Id: Iadff0240b5d108a448799ee55f9e6c24992d7af2
---
M src/systemc/core/scheduler.cc
M src/systemc/core/scheduler.hh
2 files changed, 103 insertions(+), 52 deletions(-)



diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index 42a2ca4..240ff6a 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -43,17 +43,38 @@
 namespace sc_gem5
 {

-Scheduler::Scheduler() :
-    eq(nullptr), readyEvent(this, false, ReadyPriority),
-    pauseEvent(this, false, PausePriority),
-    stopEvent(this, false, StopPriority), _throwUp(nullptr),
-    starvationEvent(this, false, StarvationPriority),
-    _elaborationDone(false), _started(false), _stopNow(false),
-    _status(StatusOther), maxTick(gem5::MaxTick),
-    maxTickEvent(this, false, MaxTickPriority),
-    timeAdvancesEvent(this, false, TimeAdvancesPriority), _numCycles(0),
-    _changeStamp(0), _current(nullptr), initDone(false), runToTime(true),
-    runOnce(false)
+Scheduler::Scheduler()
+    : eq(nullptr),
+      readyEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::runReady>>(
+              this, false, ReadyPriority)),
+      pauseEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::pause>>(
+              this, false, PausePriority)),
+      stopEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::stop>>(
+              this, false, StopPriority)),
+      _throwUp(nullptr),
+      starvationEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::pause>>(
+              this, false, StarvationPriority)),
+      _elaborationDone(false),
+      _started(false),
+      _stopNow(false),
+      _status(StatusOther),
+      maxTick(gem5::MaxTick),
+      maxTickEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::maxTickFunc>>(
+              this, false, MaxTickPriority)),
+      timeAdvancesEvent(std::make_unique<
+              gem5::EventWrapper<Scheduler, &Scheduler::timeAdvances>>(
+              this, false, TimeAdvancesPriority)),
+      _numCycles(0),
+      _changeStamp(0),
+      _current(nullptr),
+      initDone(false),
+      runToTime(true),
+      runOnce(false)
 {}

 Scheduler::~Scheduler()
@@ -79,18 +100,18 @@
     timeSlots.clear();

     // gem5 events.
-    if (readyEvent.scheduled())
-        deschedule(&readyEvent);
-    if (pauseEvent.scheduled())
-        deschedule(&pauseEvent);
-    if (stopEvent.scheduled())
-        deschedule(&stopEvent);
-    if (starvationEvent.scheduled())
-        deschedule(&starvationEvent);
-    if (maxTickEvent.scheduled())
-        deschedule(&maxTickEvent);
-    if (timeAdvancesEvent.scheduled())
-        deschedule(&timeAdvancesEvent);
+    if (readyEvent->scheduled())
+        deschedule(readyEvent.get());
+    if (pauseEvent->scheduled())
+        deschedule(pauseEvent.get());
+    if (stopEvent->scheduled())
+        deschedule(stopEvent.get());
+    if (starvationEvent->scheduled())
+        deschedule(starvationEvent.get());
+    if (maxTickEvent->scheduled())
+        deschedule(maxTickEvent.get());
+    if (timeAdvancesEvent->scheduled())
+        deschedule(timeAdvancesEvent.get());

     Process *p;
     while ((p = initList.getNext()))
@@ -266,20 +287,20 @@
 Scheduler::scheduleReadyEvent()
 {
     // Schedule the evaluate and update phases.
-    if (!readyEvent.scheduled()) {
-        schedule(&readyEvent);
-        if (starvationEvent.scheduled())
-            deschedule(&starvationEvent);
+    if (!readyEvent->scheduled()) {
+        schedule(readyEvent.get());
+        if (starvationEvent->scheduled())
+            deschedule(starvationEvent.get());
     }
 }

 void
 Scheduler::scheduleStarvationEvent()
 {
-    if (!starvationEvent.scheduled()) {
-        schedule(&starvationEvent);
-        if (readyEvent.scheduled())
-            deschedule(&readyEvent);
+    if (!starvationEvent->scheduled()) {
+        schedule(starvationEvent.get());
+        if (readyEvent->scheduled())
+            deschedule(readyEvent.get());
     }
 }

@@ -416,20 +437,20 @@
         kernel->status(::sc_core::SC_RUNNING);
     }

-    schedule(&maxTickEvent, maxTick);
+    schedule(maxTickEvent.get(), maxTick);
     scheduleTimeAdvancesEvent();

     // Return to gem5 to let it run events, etc.
     gem5::Fiber::primaryFiber()->run();

-    if (pauseEvent.scheduled())
-        deschedule(&pauseEvent);
-    if (stopEvent.scheduled())
-        deschedule(&stopEvent);
-    if (maxTickEvent.scheduled())
-        deschedule(&maxTickEvent);
-    if (starvationEvent.scheduled())
-        deschedule(&starvationEvent);
+    if (pauseEvent->scheduled())
+        deschedule(pauseEvent.get());
+    if (stopEvent->scheduled())
+        deschedule(stopEvent.get());
+    if (maxTickEvent->scheduled())
+        deschedule(maxTickEvent.get());
+    if (starvationEvent->scheduled())
+        deschedule(starvationEvent.get());

     if (_throwUp) {
         const ::sc_core::sc_report *to_throw = _throwUp;
@@ -449,10 +470,10 @@
 void
 Scheduler::schedulePause()
 {
-    if (pauseEvent.scheduled())
+    if (pauseEvent->scheduled())
         return;

-    schedule(&pauseEvent);
+    schedule(pauseEvent.get());
 }

 void
@@ -472,7 +493,7 @@
 void
 Scheduler::scheduleStop(bool finish_delta)
 {
-    if (stopEvent.scheduled())
+    if (stopEvent->scheduled())
         return;

     if (!finish_delta) {
@@ -481,7 +502,7 @@
         // pending activity.
         clear();
     }
-    schedule(&stopEvent);
+    schedule(stopEvent.get());
 }

 void
diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh
index 6eabb56..a1ee558 100644
--- a/src/systemc/core/scheduler.hh
+++ b/src/systemc/core/scheduler.hh
@@ -465,13 +465,16 @@
     }

     void runReady();
-    gem5::EventWrapper<Scheduler, &Scheduler::runReady> readyEvent;
+    std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::runReady>>
+            readyEvent;
     void scheduleReadyEvent();

     void pause();
     void stop();
-    gem5::EventWrapper<Scheduler, &Scheduler::pause> pauseEvent;
-    gem5::EventWrapper<Scheduler, &Scheduler::stop> stopEvent;
+    std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::pause>>
+            pauseEvent;
+    std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::stop>>
+            stopEvent;

     const ::sc_core::sc_report *_throwUp;

@@ -484,7 +487,8 @@
                  timeSlots.front()->targeted_when > maxTick) &&
                 initList.empty());
     }
-    gem5::EventWrapper<Scheduler, &Scheduler::pause> starvationEvent;
+    std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::pause>>
+            starvationEvent;
     void scheduleStarvationEvent();

     bool _elaborationDone;
@@ -502,15 +506,17 @@
             _changeStamp++;
         pause();
     }
-    gem5::EventWrapper<Scheduler, &Scheduler::maxTickFunc> maxTickEvent;
+    std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::maxTickFunc>>
+            maxTickEvent;

     void timeAdvances() { trace(false); }
- gem5::EventWrapper<Scheduler, &Scheduler::timeAdvances> timeAdvancesEvent; + std::unique_ptr<gem5::EventWrapper<Scheduler, &Scheduler::timeAdvances>>
+            timeAdvancesEvent;
     void
     scheduleTimeAdvancesEvent()
     {
-        if (!traceFiles.empty() && !timeAdvancesEvent.scheduled())
-            schedule(&timeAdvancesEvent);
+        if (!traceFiles.empty() && !timeAdvancesEvent->scheduled())
+            schedule(timeAdvancesEvent.get());
     }

     uint64_t _numCycles;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/67236?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iadff0240b5d108a448799ee55f9e6c24992d7af2
Gerrit-Change-Number: 67236
Gerrit-PatchSet: 1
Gerrit-Owner: Earl Ou <shunhsin...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to