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 // G4Threading implementation << 26 // $Id:$ 27 // 27 // 28 // Author: Andrea Dotti, 15 February 2013 - Fi << 28 // -------------------------------------------------------------- 29 // Revision: Jonathan R. Madsen, 21 February 2 << 29 // GEANT 4 class implementation file 30 // ------------------------------------------- << 30 // >> 31 // G4Threading.cc >> 32 // >> 33 // --------------------------------------------------------------- >> 34 // Author: Andrea Dotti (15 Feb 2013): First Implementation >> 35 // --------------------------------------------------------------- 31 36 32 #include "G4Threading.hh" 37 #include "G4Threading.hh" 33 #include "G4AutoDelete.hh" << 38 #if defined (WIN32) 34 #include "G4AutoLock.hh" << 39 #include <Windows.h> 35 #include "globals.hh" << 36 << 37 #if defined(_WIN32) << 38 # include <windows.h> << 39 #else 40 #else 40 # include <sys/syscall.h> << 41 #include <unistd.h> 41 # include <sys/types.h> << 42 #include <sys/types.h> 42 # include <unistd.h> << 43 #include <sys/syscall.h> 43 #endif 44 #endif 44 45 45 #if defined(G4MULTITHREADED) 46 #if defined(G4MULTITHREADED) 46 47 47 # include <atomic> << 48 #include <map> 48 49 49 namespace << 50 namespace { 50 { << 51 G4ThreadLocal G4int G4ThreadID = -1; 51 G4ThreadLocal G4int G4ThreadID = G4Threading << 52 } 52 G4bool isMTAppType = false; << 53 } // namespace << 54 53 55 G4Pid_t G4Threading::G4GetPidId() 54 G4Pid_t G4Threading::G4GetPidId() 56 { << 55 { // In multithreaded mode return Thread ID 57 // In multithreaded mode return Thread ID << 56 #if defined(__MACH__) 58 return std::this_thread::get_id(); << 57 return syscall(SYS_thread_selfid); >> 58 #elif defined(WIN32) >> 59 return GetCurrentThreadId(); >> 60 #else >> 61 return syscall(SYS_gettid); >> 62 #endif 59 } 63 } 60 64 61 G4int G4Threading::G4GetNumberOfCores() 65 G4int G4Threading::G4GetNumberOfCores() 62 { 66 { 63 return std::thread::hardware_concurrency(); << 67 #if defined(WIN32) >> 68 SYSTEM_INFO sysinfo; >> 69 GetSystemInfo( &sysinfo ); >> 70 return static_cast<G4int>( sysinfo.dwNumberOfProcessors ); >> 71 #else >> 72 return static_cast<G4int>(sysconf( _SC_NPROCESSORS_ONLN )); >> 73 #endif 64 } 74 } 65 75 66 void G4Threading::G4SetThreadId(G4int value) { << 76 void G4Threading::G4SetThreadId(G4int value ) { G4ThreadID = value; } 67 G4int G4Threading::G4GetThreadId() { return G4 77 G4int G4Threading::G4GetThreadId() { return G4ThreadID; } 68 G4bool G4Threading::IsWorkerThread() { return << 78 G4bool G4Threading::IsWorkerThread() { return (G4ThreadID>=0); } 69 G4bool G4Threading::IsMasterThread() { return << 70 79 71 # if defined(__linux__) || defined(_AIX) << 80 #if defined(WIN32) // WIN32 stuff needed for MT 72 G4bool G4Threading::G4SetPinAffinity(G4int cpu << 81 DWORD /*WINAPI*/ G4WaitForSingleObjectInf( __in G4Mutex m ) 73 { << 82 { return WaitForSingleObject( m , INFINITE); } 74 cpu_set_t* aset = new cpu_set_t; << 83 BOOL G4ReleaseMutex( __in G4Mutex m) 75 G4AutoDelete::Register(aset); << 84 { return ReleaseMutex(m); } 76 CPU_ZERO(aset); << 85 #endif 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 86 96 G4bool G4Threading::IsMultithreadedApplication << 87 #else // Sequential mode 97 88 98 namespace << 89 #include "globals.hh" 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 90 109 #else // Sequential mode << 91 G4int fake_mutex_lock_unlock( G4Mutex* ) { return 0; } 110 92 111 G4Pid_t G4Threading::G4GetPidId() << 93 G4Pid_t G4Threading::G4GetPidId() // In sequential mode return Process ID and not Thread ID 112 { 94 { 113 // In sequential mode return Process ID and << 95 #if defined(WIN32) 114 # if defined(WIN32) << 96 return GetCurrentProcessId(); 115 return GetCurrentProcessId(); << 97 #else 116 # else << 98 return getpid(); 117 return getpid(); << 99 #endif 118 # endif << 119 } 100 } 120 101 121 G4int G4Threading::G4GetNumberOfCores() { retu 102 G4int G4Threading::G4GetNumberOfCores() { return 1; } 122 G4int G4Threading::G4GetThreadId() { return G4 << 103 G4int G4Threading::G4GetThreadId() { return -2; } 123 G4bool G4Threading::IsWorkerThread() { return 104 G4bool G4Threading::IsWorkerThread() { return false; } 124 G4bool G4Threading::IsMasterThread() { return << 125 void G4Threading::G4SetThreadId(G4int) {} 105 void G4Threading::G4SetThreadId(G4int) {} 126 106 127 G4bool G4Threading::G4SetPinAffinity(G4int, G4 << 107 #endif 128 108 129 void G4Threading::SetMultithreadedApplication( << 130 G4bool G4Threading::IsMultithreadedApplication << 131 G4int G4Threading::WorkerThreadLeavesPool() { << 132 G4int G4Threading::WorkerThreadJoinsPool() { r << 133 G4int G4Threading::GetNumberOfRunningWorkerThr << 134 109 135 #endif << 136 110