gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
drain.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, 2015, 2017 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Andreas Sandberg
38  */
39 
40 #ifndef __SIM_DRAIN_HH__
41 #define __SIM_DRAIN_HH__
42 
43 #include <atomic>
44 #include <mutex>
45 #include <vector>
46 
47 class Drainable;
48 
71 enum class DrainState {
72  Running,
73  Draining,
74  Drained,
75  Resuming,
76 };
77 
95 {
96  private:
97  DrainManager();
98  DrainManager(DrainManager &) = delete;
99  ~DrainManager();
100 
101  public:
103  static DrainManager &instance() { return _instance; }
104 
119  bool tryDrain();
120 
124  void resume();
125 
137  void preCheckpointRestore();
138 
140  bool isDrained() const { return _state == DrainState::Drained; }
141 
143  DrainState state() const { return _state; }
144 
149  void signalDrainDone();
150 
151  public:
152  void registerDrainable(Drainable *obj);
153  void unregisterDrainable(Drainable *obj);
154 
155  private:
160  bool allInState(DrainState state) const;
161 
166  size_t drainableCount() const;
167 
169  mutable std::mutex globalLock;
170 
173 
179  std::atomic_uint _count;
180 
183 
186 };
187 
224 {
225  friend class DrainManager;
226 
227  protected:
228  Drainable();
229  virtual ~Drainable();
230 
252  virtual DrainState drain() = 0;
253 
257  virtual void drainResume() {};
258 
267  void signalDrainDone() const {
268  switch (_drainState) {
269  case DrainState::Running:
270  case DrainState::Drained:
272  return;
276  return;
277  }
278  }
279 
280  public:
282  DrainState drainState() const { return _drainState; }
283 
296  virtual void notifyFork() {};
297 
298  private:
302  void dmDrainResume();
303 
306 
313 };
314 
315 #endif
void preCheckpointRestore()
Run state fixups before a checkpoint restore operation.
Definition: drain.cc:134
DrainManager & _drainManager
Convenience reference to the drain manager.
Definition: drain.hh:305
DrainState
Object drain/handover states.
Definition: drain.hh:71
Running normally.
Buffers drained, ready for serialization/handover.
size_t drainableCount() const
Thread-safe helper function to get the number of Drainable objects in a system.
Definition: drain.cc:188
bool allInState(DrainState state) const
Helper function to check if all Drainable objects are in a specific state.
Definition: drain.cc:177
~DrainManager()
Definition: drain.cc:58
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:223
void dmDrainResume()
DrainManager interface to request a resume operation.
Definition: drain.cc:220
virtual DrainState drain()=0
Notify an object that it needs to drain its state.
std::atomic_uint _count
Number of objects still draining.
Definition: drain.hh:179
DrainState dmDrain()
DrainManager interface to request a drain operation.
Definition: drain.cc:209
virtual ~Drainable()
Definition: drain.cc:203
This class coordinates draining of a System.
Definition: drain.hh:94
DrainState state() const
Get the simulators global drain state.
Definition: drain.hh:143
std::vector< Drainable * > _allDrainable
Set of all drainable objects.
Definition: drain.hh:172
void unregisterDrainable(Drainable *obj)
Definition: drain.cc:168
DrainManager()
Definition: drain.cc:52
static DrainManager _instance
Singleton instance of the drain manager.
Definition: drain.hh:185
Draining buffers pending serialization/handover.
bool tryDrain()
Try to drain the system.
Definition: drain.cc:63
std::mutex globalLock
Lock protecting the set of drainable objects.
Definition: drain.hh:169
bool isDrained() const
Check if the system is drained.
Definition: drain.hh:140
virtual void notifyFork()
Notify a child process of a fork.
Definition: drain.hh:296
void registerDrainable(Drainable *obj)
Definition: drain.cc:159
static DrainManager & instance()
Get the singleton DrainManager instance.
Definition: drain.hh:103
virtual void drainResume()
Resume execution after a successful drain.
Definition: drain.hh:257
void resume()
Resume normal simulation in a Drained system.
Definition: drain.cc:95
void signalDrainDone() const
Signal that an object is drained.
Definition: drain.hh:267
Drainable()
Definition: drain.cc:196
DrainState _state
Global simulator drain state.
Definition: drain.hh:182
DrainState drainState() const
Return the current drain state of an object.
Definition: drain.hh:282
void signalDrainDone()
Notify the DrainManager that a Drainable object has finished draining.
Definition: drain.cc:148
DrainState _drainState
Current drain state of the object.
Definition: drain.hh:312

Generated on Fri Jun 9 2017 13:03:51 for gem5 by doxygen 1.8.6