38 #ifndef G4Threading_hh
39 #define G4Threading_hh
43 #if defined(G4MULTITHREADED)
47 #if ( defined(__MACH__) && defined(__clang__) && defined(__x86_64__) ) || \
48 ( defined(__MACH__) && defined(__GNUC__) && __GNUC__>=4 && __GNUC_MINOR__>=7 ) || \
49 defined(__linux__) || defined(_AIX)
54 #if defined(__MACH__) // needed only for MacOSX for definition of pid_t
55 #include <sys/types.h>
58 typedef pthread_mutex_t
G4Mutex;
63 #define G4MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
67 #define G4MUTEXLOCK pthread_mutex_lock
68 #define G4MUTEXUNLOCK pthread_mutex_unlock
72 #define G4MUTEXINIT(mutex) pthread_mutex_init( &mutex , NULL);
73 #define G4MUTEXDESTROY(mutex) pthread_mutex_destroy( &mutex );
77 #define G4THREADSLEEP( tick ) { sleep(tick); }
81 #define G4THREADCREATE( worker , func , arg ) { \
82 pthread_attr_t attr; \
83 pthread_attr_init(&attr); \
84 pthread_attr_setstacksize(&attr,16*1024*1024); \
85 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); \
86 pthread_create( worker, &attr, func , arg ); \
91 #define G4THREADJOIN( worker ) pthread_join( worker , NULL)
95 #define G4THREADSELF pthread_self
114 #define G4CONDITION_INITIALIZER PTHREAD_COND_INITIALIZER
116 #define G4CONDITIONWAIT( cond, mutex ) pthread_cond_wait( cond , mutex );
117 #define G4CONDTIONBROADCAST( cond ) pthread_cond_broadcast( cond );
128 #define G4MUTEX_INITIALIZER CreateMutex(NULL,FALSE,NULL)
129 DWORD G4WaitForSingleObjectInf( __in
G4Mutex m );
130 #define G4MUTEXLOCK G4WaitForSingleObjectInf
133 #define G4MUTEXINIT(mutex);
134 #define G4MUTEXDESTROY(mutex);
138 BOOL G4ReleaseMutex( __in
G4Mutex m);
139 #define G4MUTEXUNLOCK G4ReleaseMutex
141 #define G4THREADSLEEP( tick ) { Sleep(tick); }
142 #define G4THREADCREATE( worker, func, arg ) { *worker = CreateThread( NULL, 16*1024*1024 , func , arg , 0 , NULL ); }
143 #define G4THREADJOIN( worker ) WaitForSingleObject( worker , INFINITE);
144 #define G4THREADSELF GetCurrentThreadId
145 #define G4ThreadFunReturnType DWORD WINAPI
154 #define G4CONDITION_INITIALIZER CONDITION_VARIABLE_INIT
156 #define G4CONDITIONWAIT( cond , criticalsectionmutex ) SleepConditionVariableCS( cond, criticalsectionmutex , INFINITE );
157 #define G4CONDTIONBROADCAST( cond ) WakeAllConditionVariable( cond );
161 #error "No Threading model technology supported for this platform. Use sequential build !"
171 #define G4MUTEX_INITIALIZER 1
173 #define G4MUTEXINIT(mutex) ;;
174 #define G4MUTEXDESTROY(mutex) ;;
175 #define G4MUTEXLOCK fake_mutex_lock_unlock
176 #define G4MUTEXUNLOCK fake_mutex_lock_unlock
177 #define G4THREADSLEEP ( tick ) ;;
178 #define G4THREADCREATE( worker , func , arg ) ;;
179 #define G4THREADJOIN( worker ) ;;
180 #define G4THREADSELF( nothing ) G4Thread(nothing);
187 #define G4CONDITION_INITIALIZER 1
188 #define G4CONDITIONWAIT( cond, mutex ) ;;
189 #define G4CONDTIONBROADCAST( cond ) ;;
191 #endif //G4MULTITHREADING
211 #endif //G4Threading_hh
G4bool G4SetPinAffinity(G4int idx, G4Thread &at)
G4int(* thread_lock)(G4Mutex *)
void SetMultithreadedApplication(G4bool value)
void G4SetThreadId(G4int aNewValue)
G4int G4GetNumberOfCores()
G4bool IsMultithreadedApplication()
G4int(* thread_unlock)(G4Mutex *)
G4int fake_mutex_lock_unlock(G4Mutex *)
void * G4ThreadFunArgType
void * G4ThreadFunReturnType