syscall emulation: fix fast build issue
[gem5.git] / src / sim / sim_events.hh
index 50368f258fe0b9bb53c006884beecb2a6d0d5ed5..5be2609fd02449b5bdbd328dcc11abcbf22b5dde 100644 (file)
@@ -1,5 +1,19 @@
 /*
+ * Copyright (c) 2013 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2002-2005 The Regents of The University of Michigan
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
+ * Copyright (c) 2013 Mark D. Hill and David A. Wood
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __SIM_SIM_EVENTS_HH__
 #define __SIM_SIM_EVENTS_HH__
 
-#include "sim/eventq.hh"
+#include "sim/global_event.hh"
+#include "sim/serialize.hh"
 
 //
 // Event to terminate simulation at a particular cycle/instruction
 //
-class SimLoopExitEvent : public Event
+class GlobalSimLoopExitEvent : public GlobalEvent
 {
-  private:
+  protected:
     // string explaining why we're terminating
     std::string cause;
     int code;
+    Tick repeat;
 
   public:
-    // Default constructor.  Only really used for derived classes.
-    SimLoopExitEvent()
-        : Event(&mainEventQueue, Sim_Exit_Pri)
-    { }
+    // non-scheduling version for createForUnserialize()
+    GlobalSimLoopExitEvent();
+    GlobalSimLoopExitEvent(Tick when, const std::string &_cause, int c,
+                           Tick repeat = 0, bool serialize = false);
+
+    const std::string getCause() const { return cause; }
+    const int getCode() const { return code; }
+
+    void process();     // process event
+
+    virtual const char *description() const;
+};
+
+class LocalSimLoopExitEvent : public Event
+{
+  protected:
+    // string explaining why we're terminating
+    std::string cause;
+    int code;
+    Tick repeat;
 
-    SimLoopExitEvent(Tick _when, const std::string &_cause, int c = 0)
-        : Event(&mainEventQueue, Sim_Exit_Pri), cause(_cause),
-          code(c)
-    { setFlags(IsExitEvent); schedule(_when); }
+  public:
+    LocalSimLoopExitEvent();
+    LocalSimLoopExitEvent(const std::string &_cause, int c, Tick repeat = 0,
+                          bool serialize = false);
 
-    SimLoopExitEvent(EventQueue *q,
-                     Tick _when, const std::string &_cause, int c = 0)
-        : Event(q, Sim_Exit_Pri), cause(_cause), code(c)
-    { setFlags(IsExitEvent); schedule(_when); }
+    const std::string getCause() const { return cause; }
+    const int getCode() const { return code; }
 
-    std::string getCause() { return cause; }
-    int getCode() { return code; }
+    void process();     // process event
 
-    void process();    // process event
+    virtual const char *description() const;
 
-    virtual const char *description();
+    virtual void serialize(std::ostream &os);
+    virtual void unserialize(Checkpoint *cp, const std::string &section);
+    virtual void unserialize(Checkpoint *cp, const std::string &section,
+                             EventQueue *eventq);
+    static Serializable *createForUnserialize(Checkpoint *cp,
+                                              const std::string &section);
 };
 
-class CountedQuiesceEvent : public SimLoopExitEvent
+class CountedDrainEvent : public Event
 {
   private:
-    // Count down to quiescing
+    // Count of how many objects have not yet drained
     int count;
+
   public:
-    CountedQuiesceEvent()
-        : count(0)
-    { }
+    CountedDrainEvent();
+
     void process();
 
     void setCount(int _count) { count = _count; }
 
-    int getCount() { return count; }
+    const int getCount() const { return count; }
 };
 
 //
@@ -91,53 +125,16 @@ class CountedQuiesceEvent : public SimLoopExitEvent
 class CountedExitEvent : public Event
 {
   private:
-    std::string cause; // string explaining why we're terminating
-    int &downCounter;  // decrement & terminate if zero
-
-  public:
-    CountedExitEvent(EventQueue *q, const std::string &_cause,
-                     Tick _when, int &_downCounter);
-
-    void process();    // process event
-
-    virtual const char *description();
-};
-
-//
-// Event to check swap usage
-//
-class CheckSwapEvent : public Event
-{
-  private:
-    int interval;
+    std::string cause;  // string explaining why we're terminating
+    int &downCounter;   // decrement & terminate if zero
 
   public:
-    CheckSwapEvent(EventQueue *q, int ival)
-        : Event(q), interval(ival)
-    { schedule(curTick + interval); }
+    CountedExitEvent(const std::string &_cause, int &_downCounter);
 
-    void process();    // process event
+    void process();     // process event
 
-    virtual const char *description();
+    virtual const char *description() const;
 };
 
-//
-// Progress event: print out cycle every so often so we know we're
-// making forward progress.
-//
-class ProgressEvent : public Event
-{
-  protected:
-    Tick interval;
-
-  public:
-    ProgressEvent(EventQueue *q, Tick ival)
-        : Event(q), interval(ival)
-    { schedule(curTick + interval); }
-
-    void process();    // process event
-
-    virtual const char *description();
-};
 
 #endif  // __SIM_SIM_EVENTS_HH__