drain.hh (11859:76c36516e0ae) | drain.hh (11937:e6621fafa62d) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2012, 2015 ARM Limited | 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 --- 42 unchanged lines hidden (view full) --- 53 * An object starts out in the Running state. When the simulator 54 * prepares to take a snapshot or prepares a CPU for handover, it 55 * calls the drain() method to transfer the object into the Draining 56 * or Drained state. If any object enters the Draining state 57 * (Drainable::drain() returning >0), simulation continues until it 58 * all objects have entered the Drained state. 59 * 60 * Before resuming simulation, the simulator calls resume() to | 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 --- 42 unchanged lines hidden (view full) --- 53 * An object starts out in the Running state. When the simulator 54 * prepares to take a snapshot or prepares a CPU for handover, it 55 * calls the drain() method to transfer the object into the Draining 56 * or Drained state. If any object enters the Draining state 57 * (Drainable::drain() returning >0), simulation continues until it 58 * all objects have entered the Drained state. 59 * 60 * Before resuming simulation, the simulator calls resume() to |
61 * transfer the object to the Running state. | 61 * transfer the object to the Running state. This in turn results in a 62 * call to drainResume() for all Drainable objects in the 63 * simulator. New Drainable objects may be created while resuming. In 64 * such cases, the new objects will be created in the Resuming state 65 * and later resumed. |
62 * 63 * \note Even though the state of an object (visible to the rest of 64 * the world through Drainable::getState()) could be used to determine 65 * if all objects have entered the Drained state, the protocol is 66 * actually a bit more elaborate. See Drainable::drain() for details. 67 */ 68enum class DrainState { 69 Running, /** Running normally */ 70 Draining, /** Draining buffers pending serialization/handover */ | 66 * 67 * \note Even though the state of an object (visible to the rest of 68 * the world through Drainable::getState()) could be used to determine 69 * if all objects have entered the Drained state, the protocol is 70 * actually a bit more elaborate. See Drainable::drain() for details. 71 */ 72enum class DrainState { 73 Running, /** Running normally */ 74 Draining, /** Draining buffers pending serialization/handover */ |
71 Drained /** Buffers drained, ready for serialization/handover */ | 75 Drained, /** Buffers drained, ready for serialization/handover */ 76 Resuming, /** Transient state while the simulator is resuming */ |
72}; 73#endif 74 75/** 76 * This class coordinates draining of a System. 77 * 78 * When draining the simulator, we need to make sure that all 79 * Drainable objects within the system have ended up in the drained --- 68 unchanged lines hidden (view full) --- 148 void signalDrainDone(); 149 150 public: 151 void registerDrainable(Drainable *obj); 152 void unregisterDrainable(Drainable *obj); 153 154 private: 155 /** | 77}; 78#endif 79 80/** 81 * This class coordinates draining of a System. 82 * 83 * When draining the simulator, we need to make sure that all 84 * Drainable objects within the system have ended up in the drained --- 68 unchanged lines hidden (view full) --- 153 void signalDrainDone(); 154 155 public: 156 void registerDrainable(Drainable *obj); 157 void unregisterDrainable(Drainable *obj); 158 159 private: 160 /** |
161 * Helper function to check if all Drainable objects are in a 162 * specific state. 163 */ 164 bool allInState(DrainState state) const; 165 166 /** |
|
156 * Thread-safe helper function to get the number of Drainable 157 * objects in a system. 158 */ 159 size_t drainableCount() const; 160 161 /** Lock protecting the set of drainable objects */ 162 mutable std::mutex globalLock; 163 --- 92 unchanged lines hidden (view full) --- 256 * into a state where it is ready to be drained. The method is 257 * safe to call multiple times and there is no need to check that 258 * draining has been requested before calling this method. 259 */ 260 void signalDrainDone() const { 261 switch (_drainState) { 262 case DrainState::Running: 263 case DrainState::Drained: | 167 * Thread-safe helper function to get the number of Drainable 168 * objects in a system. 169 */ 170 size_t drainableCount() const; 171 172 /** Lock protecting the set of drainable objects */ 173 mutable std::mutex globalLock; 174 --- 92 unchanged lines hidden (view full) --- 267 * into a state where it is ready to be drained. The method is 268 * safe to call multiple times and there is no need to check that 269 * draining has been requested before calling this method. 270 */ 271 void signalDrainDone() const { 272 switch (_drainState) { 273 case DrainState::Running: 274 case DrainState::Drained: |
275 case DrainState::Resuming: |
|
264 return; 265 case DrainState::Draining: 266 _drainState = DrainState::Drained; 267 _drainManager.signalDrainDone(); 268 return; 269 } 270 } 271 --- 36 unchanged lines hidden --- | 276 return; 277 case DrainState::Draining: 278 _drainState = DrainState::Drained; 279 _drainManager.signalDrainDone(); 280 return; 281 } 282 } 283 --- 36 unchanged lines hidden --- |