sim: Break the eventq.hh dependency in core.hh.
authorGabe Black <gabe.black@gmail.com>
Tue, 12 Jan 2021 07:44:10 +0000 (23:44 -0800)
committerGabe Black <gabe.black@gmail.com>
Thu, 14 Jan 2021 23:14:17 +0000 (23:14 +0000)
The original implementation of curTick used a thread local variable,
_curEventQueue, and its getCurTick() method, to retrieve the curTick for
the currently active event queue. That meant that core.hh needed to
include eventq.hh so that the EventQueue type was available, which also
indirectly brought in a lot of other dependencies.

Unfortunately this couldn't easily be fixed by making curTick()
non-inline since this added a significant amount of overhead when
tested.

Instead, this change makes the code in core.hh/core.cc keep a pointer
directly to a Tick. The code which sets _curEventQueue now also sets
that pointer when _curEventQueue changes.

The way curTick() now reaches into the guts of the current EventQueue
directly is not great from a modularity perspective, but if curTick is
considered an extension of the EventQueue, then it's just odd that this
part is broken out into a different file.

Change-Id: I8341b40fe75e90672eb1d70e1a368975fcbfe926
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/38996
Maintainer: Gabe Black <gabe.black@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
src/sim/core.cc
src/sim/core.hh
src/sim/eventq.hh

index 8b3624582e85e0021e3c86e02f576ee5b3d3e5cc..ace699a3c337859afaaae8609878d988f18589d5 100644 (file)
 
 using namespace std;
 
+namespace Gem5Internal
+{
+
+__thread Tick *_curTickPtr;
+
+} // namespace Gem5Internal
+
 namespace SimClock {
 /// The simulated frequency of curTick(). (In ticks per second)
 Tick Frequency;
index 2e443e76ed08314e9d1b63d447890c9545575867..c5920490d73d22d891448a4f4574bbf58c864310 100644 (file)
 #include <string>
 
 #include "base/types.hh"
-#include "sim/eventq.hh"
+
+namespace Gem5Internal
+{
+
+// This pointer is maintained by curEventQueue in src/sim/eventq.hh.
+extern __thread Tick *_curTickPtr;
+
+} // namespace Gem5Internal
 
 /// The universal simulation clock.
-inline Tick curTick() { return _curEventQueue->getCurTick(); }
+inline Tick curTick() { return *Gem5Internal::_curTickPtr; }
 
 /// These are variables that are set based on the simulator frequency
 ///@{
index 45a5ab8d75515abc8fab7cb443625383e61cfd44..5fb0877746f3d489ed0dddb40a25102b913a0982 100644 (file)
@@ -48,6 +48,7 @@
 #include "base/types.hh"
 #include "base/uncontended_mutex.hh"
 #include "debug/Event.hh"
+#include "sim/core.hh"
 #include "sim/serialize.hh"
 
 class EventQueue;       // forward declaration
@@ -81,7 +82,7 @@ extern bool inParallelMode;
 EventQueue *getEventQueue(uint32_t index);
 
 inline EventQueue *curEventQueue() { return _curEventQueue; }
-inline void curEventQueue(EventQueue *q) { _curEventQueue = q; }
+inline void curEventQueue(EventQueue *q);
 
 /**
  * Common base class for Event and GlobalEvent, so they can share flag
@@ -617,6 +618,8 @@ operator!=(const Event &l, const Event &r)
 class EventQueue
 {
   private:
+    friend void curEventQueue(EventQueue *);
+
     std::string objName;
     Event *head;
     Tick _curTick;
@@ -968,6 +971,13 @@ class EventQueue
     }
 };
 
+inline void
+curEventQueue(EventQueue *q)
+{
+    _curEventQueue = q;
+    Gem5Internal::_curTickPtr = (q == nullptr) ? nullptr : &q->_curTick;
+}
+
 void dumpMainQueue();
 
 class EventManager