eventq: Clean up some flags
authorNathan Binkert <nate@binkert.org>
Fri, 2 Apr 2010 22:28:22 +0000 (15:28 -0700)
committerNathan Binkert <nate@binkert.org>
Fri, 2 Apr 2010 22:28:22 +0000 (15:28 -0700)
- Make the initialized flag always available, not just in debug mode.
- Make the Initialized flag actually use several bits so it is very
unlikely that something that's uninitialized accidentally looks
initialized.
- Add an initialized() function that tells you if the current event is
indeed  initialized.
- Clear the flags on delete so it can't be accidentally thought of as
initialized.
- Fix getFlags assert statement.  "How did this ever work?"

src/sim/eventq.cc
src/sim/eventq.hh

index d1f84fcb2d44fb0986901a4c30a7b78e1bca4bfa..430c6d8abde5ff46f0053bd25d51f02c71736152 100644 (file)
@@ -60,6 +60,7 @@ Counter Event::instanceCounter = 0;
 Event::~Event()
 {
     assert(!scheduled());
+    flags = 0;
 }
 
 const std::string
index e99d05997129b14cf21447e5c017e8830bf3ff9e..7c814d87246c34096aeeb978f53251c6b90581ed 100644 (file)
@@ -68,17 +68,22 @@ class Event : public Serializable, public FastAlloc
     typedef short FlagsType;
     typedef ::Flags<FlagsType> Flags;
 
-    static const FlagsType PublicRead    = 0x003f;
-    static const FlagsType PublicWrite   = 0x001d;
-    static const FlagsType Squashed      = 0x0001;
-    static const FlagsType Scheduled     = 0x0002;
-    static const FlagsType AutoDelete    = 0x0004;
-    static const FlagsType AutoSerialize = 0x0008;
-    static const FlagsType IsExitEvent   = 0x0010;
-    static const FlagsType IsMainQueue   = 0x0020;
-#ifdef EVENTQ_DEBUG
-    static const FlagsType Initialized   = 0xf000;
-#endif
+    static const FlagsType PublicRead    = 0x003f; // public readable flags
+    static const FlagsType PublicWrite   = 0x001d; // public writable flags
+    static const FlagsType Squashed      = 0x0001; // has been squashed
+    static const FlagsType Scheduled     = 0x0002; // has been scheduled
+    static const FlagsType AutoDelete    = 0x0004; // delete after dispatch
+    static const FlagsType AutoSerialize = 0x0008; // must be serialized
+    static const FlagsType IsExitEvent   = 0x0010; // special exit event
+    static const FlagsType IsMainQueue   = 0x0020; // on main event queue
+    static const FlagsType Initialized   = 0x7a40; // somewhat random bits
+    static const FlagsType InitMask      = 0xffc0; // mask for init bits
+
+    bool
+    initialized() const
+    {
+        return this && (flags & InitMask) == Initialized;
+    }
 
   public:
     typedef int8_t Priority;
@@ -146,7 +151,7 @@ class Event : public Serializable, public FastAlloc
     Flags
     getFlags(Flags _flags) const
     {
-        assert(flags.noneSet(~PublicRead));
+        assert(_flags.noneSet(~PublicRead));
         return flags.isSet(_flags);
     }
 
@@ -242,14 +247,13 @@ class Event : public Serializable, public FastAlloc
      * @param queue that the event gets scheduled on
      */
     Event(Priority p = Default_Pri)
-        : nextBin(NULL), nextInBin(NULL), _priority(p)
+        : nextBin(NULL), nextInBin(NULL), _priority(p), flags(Initialized)
     {
 #ifndef NDEBUG
         instance = ++instanceCounter;
         queue = NULL;
 #endif
 #ifdef EVENTQ_DEBUG
-        flags.set(Initialized);
         whenCreated = curTick;
         whenScheduled = 0;
 #endif
@@ -478,9 +482,7 @@ EventQueue::schedule(Event *event, Tick when)
 {
     assert((UTick)when >= (UTick)curTick);
     assert(!event->scheduled());
-#ifdef EVENTQ_DEBUG
-    assert((event->flags & Event::Initialized) == Event::Initialized);
-#endif
+    assert(event->initialized());
 
     event->setWhen(when, this);
     insert(event);
@@ -498,9 +500,7 @@ inline void
 EventQueue::deschedule(Event *event)
 {
     assert(event->scheduled());
-#ifdef EVENTQ_DEBUG
-    assert((event->flags & Event::Initialized) == Event::Initialized);
-#endif
+    assert(event->initialized());
 
     remove(event);
 
@@ -519,9 +519,7 @@ EventQueue::reschedule(Event *event, Tick when, bool always)
 {
     assert(when >= curTick);
     assert(always || event->scheduled());
-#ifdef EVENTQ_DEBUG
-    assert((event->flags & Event::Initialized) == Event::Initialized);
-#endif
+    assert(event->initialized());
 
     if (event->scheduled())
         remove(event);