Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4StateManager class implementation << 27 // 26 // 28 // Authors: G.Cosmo, M.Asai - November 1996 << 27 // $Id: G4StateManager.cc 67970 2013-03-13 10:10:06Z gcosmo $ 29 // ------------------------------------------- << 28 // >> 29 // >> 30 // ------------------------------------------------------------ >> 31 // GEANT 4 class implementation file >> 32 // >> 33 // ---------------- G4StateManager ---------------- >> 34 // by Gabriele Cosmo, November 1996 >> 35 // ------------------------------------------------------------ 30 36 31 #include "G4StateManager.hh" 37 #include "G4StateManager.hh" 32 #include "G4ios.hh" 38 #include "G4ios.hh" 33 39 34 // Initialization of the static pointer of the 40 // Initialization of the static pointer of the single class instance 35 // 41 // 36 G4ThreadLocal G4StateManager* G4StateManager:: << 42 G4ThreadLocal G4StateManager* G4StateManager::theStateManager = 0; 37 G4int G4StateManager::verboseLevel << 38 43 39 // ------------------------------------------- << 40 G4StateManager::G4StateManager() 44 G4StateManager::G4StateManager() >> 45 : theCurrentState(G4State_PreInit), >> 46 thePreviousState(G4State_PreInit), >> 47 theBottomDependent(0), >> 48 suppressAbortion(0), >> 49 msgptr(0), >> 50 exceptionHandler(0) 41 { 51 { 42 #ifdef G4MULTITHREADED 52 #ifdef G4MULTITHREADED 43 G4iosInitialization(); 53 G4iosInitialization(); 44 #endif 54 #endif 45 } 55 } 46 56 47 G4StateManager::~G4StateManager() 57 G4StateManager::~G4StateManager() 48 { 58 { 49 G4VStateDependent* state = nullptr; << 59 G4VStateDependent* state=0; 50 60 51 while(!theDependentsList.empty()) << 61 while (theDependentsList.size()>0) 52 { 62 { 53 state = theDependentsList.back(); 63 state = theDependentsList.back(); 54 theDependentsList.pop_back(); 64 theDependentsList.pop_back(); 55 for(auto i = theDependentsList.cbegin(); i << 65 for (std::vector<G4VStateDependent*>::iterator >> 66 i=theDependentsList.begin(); i!=theDependentsList.end();) 56 { 67 { 57 if(*i == state) << 68 if (*i==state) 58 { 69 { 59 i = theDependentsList.erase(i); 70 i = theDependentsList.erase(i); 60 } 71 } 61 else 72 else 62 { 73 { 63 ++i; 74 ++i; 64 } 75 } 65 } << 76 } 66 delete state; << 77 if ( state ) { delete state; } 67 } << 78 } 68 theStateManager = nullptr; << 69 #ifdef G4MULTITHREADED_DEACTIVATE 79 #ifdef G4MULTITHREADED_DEACTIVATE 70 G4iosFinalization(); 80 G4iosFinalization(); 71 #endif 81 #endif 72 } 82 } 73 83 74 // ------------------------------------------- << 84 // ------------------------------------------------------------------------- 75 G4StateManager* G4StateManager::GetStateManage << 85 // No matter how copy-constructor and operators below are implemented ... >> 86 // just dummy implementations, since not relevant for the singleton and >> 87 // declared private. >> 88 // >> 89 G4StateManager::G4StateManager(const G4StateManager &right) >> 90 : theCurrentState(right.theCurrentState), >> 91 thePreviousState(right.thePreviousState), >> 92 theDependentsList(right.theDependentsList), >> 93 theBottomDependent(right.theBottomDependent), >> 94 suppressAbortion(right.suppressAbortion), >> 95 msgptr(right.msgptr), >> 96 exceptionHandler(right.exceptionHandler) 76 { 97 { 77 if(theStateManager == nullptr) << 78 { << 79 theStateManager = new G4StateManager; << 80 } << 81 return theStateManager; << 82 } 98 } 83 99 84 // ------------------------------------------- << 100 G4StateManager& 85 G4bool G4StateManager::RegisterDependent(G4VSt << 101 G4StateManager::operator=(const G4StateManager &right) 86 G4boo << 87 { 102 { 88 G4bool ack = true; << 103 if (&right == this) { return *this; } 89 if(!bottom) << 104 90 { << 105 theCurrentState = right.theCurrentState; 91 theDependentsList.push_back(aDependent); << 106 thePreviousState = right.thePreviousState; 92 } << 107 theDependentsList = right.theDependentsList; 93 else << 108 theBottomDependent = right.theBottomDependent; 94 { << 109 suppressAbortion = right.suppressAbortion; 95 if(theBottomDependent != nullptr) << 110 msgptr = right.msgptr; >> 111 exceptionHandler = right.exceptionHandler; >> 112 >> 113 return *this; >> 114 } >> 115 >> 116 G4int >> 117 G4StateManager::operator==(const G4StateManager &right) const >> 118 { >> 119 return (this == &right); >> 120 } >> 121 >> 122 G4int >> 123 G4StateManager::operator!=(const G4StateManager &right) const >> 124 { >> 125 return (this != &right); >> 126 } >> 127 // >> 128 // ------------------------------------------------------------------------- >> 129 >> 130 G4StateManager* >> 131 G4StateManager::GetStateManager() >> 132 { >> 133 if (!theStateManager) 96 { 134 { 97 theDependentsList.push_back(theBottomDep << 135 theStateManager = new G4StateManager; 98 } 136 } 99 theBottomDependent = aDependent; << 137 return theStateManager; 100 } << 101 return ack; << 102 } 138 } 103 139 104 // ------------------------------------------- << 140 G4bool 105 G4bool G4StateManager::DeregisterDependent(G4V << 141 G4StateManager::RegisterDependent(G4VStateDependent* aDependent, G4bool bottom) 106 { 142 { 107 G4VStateDependent* tmp = nullptr; << 143 G4bool ack=true; 108 for(auto i = theDependentsList.cbegin(); i ! << 144 if(!bottom) >> 145 { >> 146 theDependentsList.push_back(aDependent); >> 147 } >> 148 else >> 149 { >> 150 if(theBottomDependent) >> 151 { >> 152 theDependentsList.push_back(theBottomDependent); >> 153 } >> 154 theBottomDependent = aDependent; >> 155 } >> 156 return ack; >> 157 } >> 158 >> 159 G4bool >> 160 G4StateManager::DeregisterDependent(G4VStateDependent* aDependent) >> 161 { >> 162 G4VStateDependent* tmp = 0; >> 163 for (std::vector<G4VStateDependent*>::iterator i=theDependentsList.begin(); >> 164 i!=theDependentsList.end();) 109 { 165 { 110 if(**i == *aDependent) << 166 if (**i==*aDependent) 111 { 167 { 112 tmp = *i; 168 tmp = *i; 113 i = theDependentsList.erase(i); << 169 i = theDependentsList.erase(i); 114 } 170 } 115 else 171 else 116 { 172 { 117 ++i; 173 ++i; 118 } 174 } 119 } 175 } 120 return (tmp != nullptr); << 176 return (tmp != 0); 121 } 177 } 122 178 123 // ------------------------------------------- << 179 G4ApplicationState 124 const G4ApplicationState& G4StateManager::GetC << 180 G4StateManager::GetCurrentState() const 125 { 181 { 126 return theCurrentState; << 182 return theCurrentState; 127 } 183 } 128 184 129 // ------------------------------------------- << 185 G4ApplicationState 130 const G4ApplicationState& G4StateManager::GetP << 186 G4StateManager::GetPreviousState() const 131 { 187 { 132 return thePreviousState; << 188 return thePreviousState; 133 } 189 } 134 190 135 // ------------------------------------------- << 191 G4bool 136 G4bool G4StateManager::SetNewState(const G4App << 192 G4StateManager::SetNewState(G4ApplicationState requestedState) 137 { << 193 { return SetNewState(requestedState,0); } 138 return SetNewState(requestedState, nullptr); << 139 } << 140 194 141 // ------------------------------------------- << 195 G4bool 142 G4bool G4StateManager::SetNewState(const G4App << 196 G4StateManager::SetNewState(G4ApplicationState requestedState, const char* msg) 143 const char* << 144 { 197 { 145 if(requestedState == G4State_Abort && suppre << 198 if(requestedState==G4State_Abort && suppressAbortion>0) 146 { << 199 { 147 if(suppressAbortion == 2) << 200 if(suppressAbortion==2) { return false; } 148 { << 201 if(theCurrentState==G4State_EventProc) { return false; } 149 return false; << 202 } 150 } << 203 msgptr = msg; 151 if(theCurrentState == G4State_EventProc) << 204 size_t i=0; 152 { << 205 G4bool ack = true; 153 return false; << 206 G4ApplicationState savedState = thePreviousState; 154 } << 207 thePreviousState = theCurrentState; 155 } << 208 while ((ack) && (i<theDependentsList.size())) 156 msgptr = msg; << 209 { 157 std::size_t i = 0; << 210 ack = theDependentsList[i]->Notify(requestedState); 158 G4bool ack = true; << 211 i++; 159 G4ApplicationState savedState = thePreviousS << 212 } 160 thePreviousState = theCurrentSt << 213 if(theBottomDependent) 161 << 214 { 162 while((ack) && (i < theDependentsList.size() << 215 ack = theBottomDependent->Notify(requestedState); 163 { << 216 } 164 ack = theDependentsList[i]->Notify(request << 165 ++i; << 166 } << 167 if(theBottomDependent != nullptr) << 168 { << 169 ack = theBottomDependent->Notify(requested << 170 } << 171 217 172 if(!ack) << 218 if(!ack) 173 { << 219 { thePreviousState = savedState; } 174 thePreviousState = savedState; << 220 else 175 } << 221 { theCurrentState = requestedState; } 176 else << 222 msgptr = 0; 177 { << 223 return ack; 178 theCurrentState = requestedState; << 179 if(verboseLevel > 0) << 180 { << 181 G4cout << "#### G4StateManager::SetNewSt << 182 << GetStateString(thePreviousStat << 183 << GetStateString(requestedState) << 184 } << 185 } << 186 msgptr = nullptr; << 187 return ack; << 188 } 224 } 189 225 190 // ------------------------------------------- << 226 G4VStateDependent* 191 G4VStateDependent* G4StateManager::RemoveDepen << 227 G4StateManager::RemoveDependent(const G4VStateDependent* aDependent) 192 const G4VStateDependent* aDependent) << 193 { 228 { 194 G4VStateDependent* tmp = nullptr; << 229 G4VStateDependent* tmp = 0; 195 for(auto i = theDependentsList.cbegin(); i ! << 230 for (std::vector<G4VStateDependent*>::iterator i=theDependentsList.begin(); >> 231 i!=theDependentsList.end();) 196 { 232 { 197 if(**i == *aDependent) << 233 if (**i==*aDependent) 198 { 234 { 199 tmp = *i; 235 tmp = *i; 200 i = theDependentsList.erase(i); << 236 i = theDependentsList.erase(i); 201 } 237 } 202 else 238 else 203 { 239 { 204 ++i; 240 ++i; 205 } 241 } 206 } 242 } 207 return tmp; 243 return tmp; 208 } 244 } 209 245 210 // ------------------------------------------- << 246 G4String 211 G4String G4StateManager::GetStateString(const << 247 G4StateManager::GetStateString(G4ApplicationState aState) const 212 { 248 { 213 G4String stateName; 249 G4String stateName; 214 switch(aState) 250 switch(aState) 215 { 251 { 216 case G4State_PreInit: 252 case G4State_PreInit: 217 stateName = "PreInit"; << 253 stateName = "PreInit"; break; 218 break; << 219 case G4State_Init: 254 case G4State_Init: 220 stateName = "Init"; << 255 stateName = "Init"; break; 221 break; << 222 case G4State_Idle: 256 case G4State_Idle: 223 stateName = "Idle"; << 257 stateName = "Idle"; break; 224 break; << 225 case G4State_GeomClosed: 258 case G4State_GeomClosed: 226 stateName = "GeomClosed"; << 259 stateName = "GeomClosed"; break; 227 break; << 228 case G4State_EventProc: 260 case G4State_EventProc: 229 stateName = "EventProc"; << 261 stateName = "EventProc"; break; 230 break; << 231 case G4State_Quit: 262 case G4State_Quit: 232 stateName = "Quit"; << 263 stateName = "Quit"; break; 233 break; << 234 case G4State_Abort: 264 case G4State_Abort: 235 stateName = "Abort"; << 265 stateName = "Abort"; break; 236 break; << 237 default: 266 default: 238 stateName = "Unknown"; << 267 stateName = "Unknown"; break; 239 break; << 240 } 268 } 241 return stateName; 269 return stateName; 242 } 270 } 243 271 244 // ------------------------------------------- << 272 //void G4StateManager::Pause() 245 void G4StateManager::SetVerboseLevel(G4int val << 273 //{ 246 << 274 // Pause("G4_pause> "); 247 // ------------------------------------------- << 275 //} 248 void G4StateManager::NotifyDeletion(const G4Ev << 276 // 249 { << 277 //void G4StateManager::Pause(const char* msg) 250 for(auto& d : theDependentsList) << 278 //{ 251 { d->NotifyDeletion(evt); } << 279 // G4String msgS = msg; 252 } << 280 // Pause(msgS); 253 << 281 //} 254 // ------------------------------------------- << 282 // 255 void G4StateManager::NotifyDeletion(const G4Ru << 283 //void G4StateManager::Pause(G4String msg) 256 { << 284 //{ 257 for(auto& d : theDependentsList) << 285 // G4UImanager::GetUIpointer()->PauseSession(msg); 258 { d->NotifyDeletion(rn); } << 286 //} 259 } << 260 287