sim,cpu: make exit_group halt all threads in a group
[gem5.git] / src / sim / sim_events.hh
index 4abfb317cbfd5f89be6b14dce4d53408cc94f440..6343071dc53b1d387d129932d0efcdc1baa627a2 100644 (file)
@@ -12,6 +12,8 @@
  * 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
 {
   protected:
     // string explaining why we're terminating
@@ -59,37 +61,41 @@ class SimLoopExitEvent : public Event
 
   public:
     // non-scheduling version for createForUnserialize()
-    SimLoopExitEvent();
-    SimLoopExitEvent(const std::string &_cause, int c, Tick repeat = 0,
-                     bool serialize = false);
+    GlobalSimLoopExitEvent();
+    GlobalSimLoopExitEvent(Tick when, const std::string &_cause, int c,
+                           Tick repeat = 0);
 
-    std::string getCause() { return cause; }
-    int getCode() { return code; }
+    const std::string getCause() const { return cause; }
+    int getCode() const { return code; }
 
     void process();     // process event
 
     virtual const char *description() const;
-
-    virtual void serialize(std::ostream &os);
-    virtual void unserialize(Checkpoint *cp, const std::string &section);
-    static Serializable *createForUnserialize(Checkpoint *cp,
-                                              const std::string &section);
 };
 
-class CountedDrainEvent : public Event
+class LocalSimLoopExitEvent : public Event
 {
-  private:
-    // Count of how many objects have not yet drained
-    int count;
+  protected:
+    // string explaining why we're terminating
+    std::string cause;
+    int code;
+    Tick repeat;
 
   public:
-    CountedDrainEvent();
+    LocalSimLoopExitEvent();
+    LocalSimLoopExitEvent(const std::string &_cause, int c, Tick repeat = 0);
+
+    const std::string getCause() const { return cause; }
+    int getCode() const { return code; }
 
-    void process();
+    void process() override;     // process event
 
-    void setCount(int _count) { count = _count; }
+    const char *description() const override;
 
-    int getCount() { return count; }
+    void serialize(CheckpointOut &cp) const override;
+    void unserialize(CheckpointIn &cp) override;
+    static Serializable *createForUnserialize(CheckpointIn &cp,
+                                              const std::string &section);
 };
 
 //
@@ -106,9 +112,9 @@ class CountedExitEvent : public Event
   public:
     CountedExitEvent(const std::string &_cause, int &_downCounter);
 
-    void process();     // process event
+    void process() override;     // process event
 
-    virtual const char *description() const;
+    const char *description() const override;
 };