Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4Threading implementation 27 // 28 // Author: Andrea Dotti, 15 February 2013 - Fi 29 // Revision: Jonathan R. Madsen, 21 February 2 30 // ------------------------------------------- 31 32 #include "G4Threading.hh" 33 #include "G4AutoDelete.hh" 34 #include "G4AutoLock.hh" 35 #include "globals.hh" 36 37 #if defined(_WIN32) 38 # include <windows.h> 39 #else 40 # include <sys/syscall.h> 41 # include <sys/types.h> 42 # include <unistd.h> 43 #endif 44 45 #if defined(G4MULTITHREADED) 46 47 # include <atomic> 48 49 namespace 50 { 51 G4ThreadLocal G4int G4ThreadID = G4Threading 52 G4bool isMTAppType = false; 53 } // namespace 54 55 G4Pid_t G4Threading::G4GetPidId() 56 { 57 // In multithreaded mode return Thread ID 58 return std::this_thread::get_id(); 59 } 60 61 G4int G4Threading::G4GetNumberOfCores() 62 { 63 return std::thread::hardware_concurrency(); 64 } 65 66 void G4Threading::G4SetThreadId(G4int value) { 67 G4int G4Threading::G4GetThreadId() { return G4 68 G4bool G4Threading::IsWorkerThread() { return 69 G4bool G4Threading::IsMasterThread() { return 70 71 # if defined(__linux__) || defined(_AIX) 72 G4bool G4Threading::G4SetPinAffinity(G4int cpu 73 { 74 cpu_set_t* aset = new cpu_set_t; 75 G4AutoDelete::Register(aset); 76 CPU_ZERO(aset); 77 CPU_SET(cpu, aset); 78 pthread_t& _aT = (pthread_t&) (aT); 79 return (pthread_setaffinity_np(_aT, sizeof(c 80 } 81 # else // Not available for Mac, WIN,... 82 G4bool G4Threading::G4SetPinAffinity(G4int, G4 83 { 84 G4Exception("G4Threading::G4SetPinAffinity() 85 "Affinity setting not available 86 "ignoring..."); 87 return true; 88 } 89 # endif 90 91 void G4Threading::SetMultithreadedApplication( 92 { 93 isMTAppType = value; 94 } 95 96 G4bool G4Threading::IsMultithreadedApplication 97 98 namespace 99 { 100 std::atomic_int numActThreads(0); 101 } 102 G4int G4Threading::WorkerThreadLeavesPool() { 103 G4int G4Threading::WorkerThreadJoinsPool() { r 104 G4int G4Threading::GetNumberOfRunningWorkerThr 105 { 106 return numActThreads.load(); 107 } 108 109 #else // Sequential mode 110 111 G4Pid_t G4Threading::G4GetPidId() 112 { 113 // In sequential mode return Process ID and 114 # if defined(WIN32) 115 return GetCurrentProcessId(); 116 # else 117 return getpid(); 118 # endif 119 } 120 121 G4int G4Threading::G4GetNumberOfCores() { retu 122 G4int G4Threading::G4GetThreadId() { return G4 123 G4bool G4Threading::IsWorkerThread() { return 124 G4bool G4Threading::IsMasterThread() { return 125 void G4Threading::G4SetThreadId(G4int) {} 126 127 G4bool G4Threading::G4SetPinAffinity(G4int, G4 128 129 void G4Threading::SetMultithreadedApplication( 130 G4bool G4Threading::IsMultithreadedApplication 131 G4int G4Threading::WorkerThreadLeavesPool() { 132 G4int G4Threading::WorkerThreadJoinsPool() { r 133 G4int G4Threading::GetNumberOfRunningWorkerThr 134 135 #endif 136