misc: Make registerExitCallback use CallbackQueue2.
authorGabe Black <gabeblack@google.com>
Fri, 14 Aug 2020 07:02:17 +0000 (00:02 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 18 Aug 2020 11:49:06 +0000 (11:49 +0000)
Issue-on: https://gem5.atlassian.net/browse/GEM5-698
Change-Id: I526d4a19ca4e54a6469a4ee26693c1c0400fcc70
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/32644
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
14 files changed:
src/base/cp_annotate.cc
src/cpu/inst_pb_trace.cc
src/cpu/o3/probe/elastic_trace.cc
src/dev/storage/disk_image.cc
src/dev/virtio/fs9p.cc
src/gpu-compute/compute_unit.cc
src/gpu-compute/compute_unit.hh
src/mem/cache/tags/base.cc
src/mem/cache/tags/base.hh
src/mem/dramsim2.cc
src/mem/probes/mem_trace.cc
src/sim/core.cc
src/sim/core.hh
src/sim/sim_exit.hh

index 159e6e0f71f69a6768a7cf55fb7c5b378da5ffc4..c66b8438bc9357b0c6363d9bf1dae0d8f6a3b537 100644 (file)
@@ -79,26 +79,6 @@ using namespace TheISA;
 bool CPA::exists;
 CPA *CPA::_cpa;
 
-class AnnotateDumpCallback : public Callback
-{
-
-  private:
-    CPA *cpa;
-  public:
-    virtual void process();
-    AnnotateDumpCallback(CPA *_cpa)
-        : cpa(_cpa)
-    {}
-};
-
-void
-AnnotateDumpCallback::process()
-{
-    cpa->dump(true);
-    cpa->dumpKey();
-}
-
-
 CPA::CPA(Params *p)
     : SimObject(p), numSm(0), numSmt(0), numSys(0), numQs(0), conId(0)
 {
@@ -140,7 +120,7 @@ CPA::startup()
     ah.key_off = 0;
     osbin->write((char*)&ah, sizeof(AnnotateHeader));
 
-    registerExitCallback(new AnnotateDumpCallback(this));
+    registerExitCallback([this]() { dump(true); dumpKey(); });
 }
 
 uint64_t
index 3f3cfa8fc382ad7899be00fcb253b91527e92122..7d7bbaa6dd1dc2cf7eef66a70be34e99591626cc 100644 (file)
@@ -91,9 +91,7 @@ InstPBTrace::createTraceFile(std::string filename)
     traceStream->write(header_msg);
 
     // get a callback when we exit so we can close the file
-    Callback *cb = new MakeCallback<InstPBTrace,
-             &InstPBTrace::closeStreams>(this);
-    registerExitCallback(cb);
+    registerExitCallback([this]() { closeStreams(); });
 }
 
 void
index c328b3c2e9f0868d05da51000f3a3850e0a83ae8..8292c336ec4678831ca66b08ddb7dce0c072615e 100644 (file)
@@ -88,9 +88,7 @@ ElasticTrace::ElasticTrace(const ElasticTraceParams* params)
     data_rec_header.set_window_size(depWindowSize);
     dataTraceStream->write(data_rec_header);
     // Register a callback to flush trace records and close the output streams.
-    Callback* cb = new MakeCallback<ElasticTrace,
-        &ElasticTrace::flushTraces>(this);
-    registerExitCallback(cb);
+    registerExitCallback([this]() {  flushTraces(); });
 }
 
 void
index 319bccf138307af8e4f6a78850735ba29c8385f7..e4b1ce02c947d2c501fe11db63af8526d06cce75 100644 (file)
@@ -168,16 +168,6 @@ RawDiskImageParams::create()
 const uint32_t CowDiskImage::VersionMajor = 1;
 const uint32_t CowDiskImage::VersionMinor = 0;
 
-class CowDiskCallback : public Callback
-{
-  private:
-    CowDiskImage *image;
-
-  public:
-    CowDiskCallback(CowDiskImage *i) : image(i) {}
-    void process() { image->save(); delete this; }
-};
-
 CowDiskImage::CowDiskImage(const Params *p)
     : DiskImage(p), filename(p->image_file), child(p->child), table(NULL)
 {
@@ -191,7 +181,7 @@ CowDiskImage::CowDiskImage(const Params *p)
         }
 
         if (!p->read_only)
-            registerExitCallback(new CowDiskCallback(this));
+            registerExitCallback([this]() { save(); });
     }
 }
 
index a548d72e9e1546f3164bcff79eebcfc57dd757b7..2392c0b91b43c467328af535039f1e12afaabcbb 100644 (file)
@@ -315,9 +315,7 @@ VirtIO9PDiod::VirtIO9PDiod(Params *params)
       fd_to_diod(-1), fd_from_diod(-1), diod_pid(-1)
 {
     // Register an exit callback so we can kill the diod process
-    Callback* cb = new MakeCallback<VirtIO9PDiod,
-                                    &VirtIO9PDiod::terminateDiod>(this);
-    registerExitCallback(cb);
+    registerExitCallback([this]() { terminateDiod(); });
 }
 
 VirtIO9PDiod::~VirtIO9PDiod()
index 067c254696f83e1f46cdb510dc87e8407427709b..7e0947f65fc200711ca5d56b5514883a2d6c2f32 100644 (file)
@@ -179,8 +179,7 @@ ComputeUnit::ComputeUnit(const Params *p) : ClockedObject(p),
     int tlbPort_width = perLaneTLB ? wfSize() : 1;
     tlbPort.resize(tlbPort_width);
 
-    cuExitCallback = new CUExitCallback(this);
-    registerExitCallback(cuExitCallback);
+    registerExitCallback([this]() { exitCallback(); });
 
     lastExecCycle.resize(numVectorALUs, 0);
 
@@ -215,7 +214,6 @@ ComputeUnit::~ComputeUnit()
         lastVaddrSimd[j].clear();
     }
     lastVaddrCU.clear();
-    delete cuExitCallback;
     delete ldsPort;
 }
 
@@ -2460,16 +2458,15 @@ ComputeUnit::updatePageDivergenceDist(Addr addr)
 }
 
 void
-ComputeUnit::CUExitCallback::process()
+ComputeUnit::exitCallback()
 {
-    if (computeUnit->countPages) {
-        std::ostream *page_stat_file =
-            simout.create(computeUnit->name().c_str())->stream();
+    if (countPages) {
+        std::ostream *page_stat_file = simout.create(name().c_str())->stream();
 
         *page_stat_file << "page, wavefront accesses, workitem accesses" <<
             std::endl;
 
-        for (auto iter : computeUnit->pageAccesses) {
+        for (auto iter : pageAccesses) {
             *page_stat_file << std::hex << iter.first << ",";
             *page_stat_file << std::dec << iter.second.first << ",";
             *page_stat_file << std::dec << iter.second.second << std::endl;
index 22960c0c9166e4011be48139b2ee1e50f3cb92f8..cf51a8636617caa5ae0b4acc31ac8af397c86004 100644 (file)
@@ -350,11 +350,6 @@ class ComputeUnit : public ClockedObject
 
     /*
      * for Counting page accesses
-     *
-     * cuExitCallback inherits from Callback. When you register a callback
-     * function as an exit callback, it will get added to an exit callback
-     * queue, such that on simulation exit, all callbacks in the callback
-     * queue will have their process() function called.
      */
     bool countPages;
 
@@ -631,24 +626,7 @@ class ComputeUnit : public ClockedObject
     typedef std::unordered_map<Addr, std::pair<int, int>> pageDataStruct;
     pageDataStruct pageAccesses;
 
-    class CUExitCallback : public Callback
-    {
-      private:
-        ComputeUnit *computeUnit;
-
-      public:
-        virtual ~CUExitCallback() { }
-
-        CUExitCallback(ComputeUnit *_cu)
-        {
-            computeUnit = _cu;
-        }
-
-        virtual void
-        process();
-    };
-
-    CUExitCallback *cuExitCallback;
+    void exitCallback();
 
     class GMTokenPort : public TokenMasterPort
     {
index bd6f55c30035941970373952a98cd2d5473c5bde..faad7be05aacf2e4f4851d41186276bbf4108e58 100644 (file)
@@ -64,7 +64,7 @@ BaseTags::BaseTags(const Params *p)
       dataBlks(new uint8_t[p->size]), // Allocate data storage in one big chunk
       stats(*this)
 {
-    registerExitCallback(new BaseTagsCallback(this));
+    registerExitCallback([this]() { cleanupRefs(); });
 }
 
 ReplaceableEntry*
index 90152d3b59d072b2cd9f2d72c03a9cabfc70f97f..5f0246205d8cc5b0645cfcb2c016a1e848a2bdc9 100644 (file)
@@ -353,12 +353,4 @@ class BaseTags : public ClockedObject
     void computeStatsVisitor(CacheBlk &blk);
 };
 
-class BaseTagsCallback : public Callback
-{
-    BaseTags *tags;
-  public:
-    BaseTagsCallback(BaseTags *t) : tags(t) {}
-    virtual void process() { tags->cleanupRefs(); };
-};
-
 #endif //__MEM_CACHE_TAGS_BASE_HH__
index 029e7b8c15270c6c0e842d189225214971711e13..aeafad0415aa19d8d27999fb214d35d8a0730965 100644 (file)
@@ -68,9 +68,7 @@ DRAMSim2::DRAMSim2(const Params* p) :
 
     // Register a callback to compensate for the destructor not
     // being called. The callback prints the DRAMSim2 stats.
-    Callback* cb = new MakeCallback<DRAMSim2Wrapper,
-        &DRAMSim2Wrapper::printStats>(wrapper);
-    registerExitCallback(cb);
+    registerExitCallback([&wrapper]() { wrapper->printStats(); });
 }
 
 void
index 9031d6083671c2c3b519c39204d2a02c09150828..a11b9e60a33ae47070bf3918ae61ba83ff2cc571 100644 (file)
@@ -74,8 +74,7 @@ MemTraceProbe::MemTraceProbe(MemTraceProbeParams *p)
     // Register a callback to compensate for the destructor not
     // being called. The callback forces the stream to flush and
     // closes the output file.
-    registerExitCallback(
-        new MakeCallback<MemTraceProbe, &MemTraceProbe::closeStreams>(this));
+    registerExitCallback([this]() { closeStreams(); });
 }
 
 void
index 18c6985f8a2ed597ce411e6478da16fc36ec5319..8dd5c852fa5dad12fc161575016daf18b93bdaf4 100644 (file)
@@ -126,10 +126,10 @@ setOutputDir(const string &dir)
 /**
  * Queue of C++ callbacks to invoke on simulator exit.
  */
-inline CallbackQueue &
+inline CallbackQueue2 &
 exitCallbacks()
 {
-    static CallbackQueue theQueue;
+    static CallbackQueue2 theQueue;
     return theQueue;
 }
 
@@ -137,9 +137,9 @@ exitCallbacks()
  * Register an exit callback.
  */
 void
-registerExitCallback(Callback *callback)
+registerExitCallback(const std::function<void()> &callback)
 {
-    exitCallbacks().add(callback);
+    exitCallbacks().push_back(callback);
 }
 
 /**
index 48b70960b23015c8e9d6ba6743f6d58dd6727333..2e443e76ed08314e9d1b63d447890c9545575867 100644 (file)
@@ -35,6 +35,7 @@
  * information, output directory and exit events
  */
 
+#include <functional>
 #include <string>
 
 #include "base/types.hh"
@@ -95,8 +96,7 @@ Tick getClockFrequency(); // Ticks per second.
 
 void setOutputDir(const std::string &dir);
 
-class Callback;
-void registerExitCallback(Callback *callback);
+void registerExitCallback(const std::function<void()> &callback);
 void doExitCleanup();
 
 #endif /* __SIM_CORE_HH__ */
index b0b5111b0481444cbcb35bf582f21fa34c53f84d..a79d3e2cd045f3e88c0d7c3ad00c8c485c8a9b65 100644 (file)
 
 Tick curTick();
 
-// forward declaration
-class Callback;
-
 /// Register a callback to be called when Python exits.  Defined in
 /// sim/main.cc.
-void registerExitCallback(Callback *);
+void registerExitCallback(const std::function<void()> &);
 
 /// Schedule an event to exit the simulation loop (returning to
 /// Python) at the end of the current cycle (curTick()).  The message