diff --git a/montecarlo/vmc/inc/TMCtls.h b/montecarlo/vmc/inc/TMCtls.h new file mode 100644 index 0000000000000000000000000000000000000000..95fea95a98b92f7ed2bf563f229450a5d11c8b25 --- /dev/null +++ b/montecarlo/vmc/inc/TMCtls.h @@ -0,0 +1,62 @@ +// @(#)root/vmc:$Id$ +// Author: Ivana Hrivnacova, 29/04/2014 + +/************************************************************************* + * Copyright (C) 2014, Rene Brun and Fons Rademakers. * + * All rights reserved. * + * * + * For the licensing terms see $ROOTSYS/LICENSE. * + * For the list of contributors see $ROOTSYS/README/CREDITS. * + *************************************************************************/ + +// ******************************************************************** +// * License and Disclaimer * +// * * +// * The Geant4 software is copyright of the Copyright Holders of * +// * the Geant4 Collaboration. It is provided under the terms and * +// * conditions of the Geant4 Software License, included in the file * +// * LICENSE and available at http://cern.ch/geant4/license . These * +// * include a list of copyright holders. * +// * * +// * Neither the authors of this software system, nor their employing * +// * institutes,nor the agencies providing financial support for this * +// * work make any representation or warranty, express or implied, * +// * regarding this software system or assume any liability for its * +// * use. Please see the license in the file LICENSE and URL above * +// * for the full disclaimer and the limitation of liability. * +// * * +// * This code implementation is the result of the scientific and * +// * technical work of the GEANT4 collaboration. * +// * By using, copying, modifying or distributing the software (or * +// * any work based on the software) you agree to acknowledge its * +// * use in resulting scientific publications, and indicate your * +// * acceptance of all terms of the Geant4 Software license. * +// ******************************************************************** + +#ifndef ROOT_TMCtls +#define ROOT_TMCtls + +// Thread Local Storage typedefs +// +// According to Geant4 tls.hh and G4Threading.hh + +// Always build with thread support but keep a possibility to introduce +// a build option +#define VMC_MULTITHREADED 1 + +#if ( defined (VMC_MULTITHREADED) ) + #if ( ( defined(__MACH__) && defined(__clang__) && defined(__x86_64__) ) || \ + ( defined(__MACH__) && defined(__GNUC__) && __GNUC__>=4 && __GNUC_MINOR__>=7 ) || \ + defined(__linux__) || defined(_AIX) ) && ( !defined(__CINT__) ) + // Multi-threaded build: for POSIX systems + #include <pthread.h> + #define TMCThreadLocal __thread + #else + //# error "No Thread Local Storage (TLS) technology supported for this platform. Use sequential build !" + #define TMCThreadLocal + #endif +#else + #define TMCThreadLocal +#endif + +#endif //ROOT_TMCtls diff --git a/montecarlo/vmc/inc/TVirtualMC.h b/montecarlo/vmc/inc/TVirtualMC.h index 0abf72c157ef11efd3b4d2c0fb992282c3b843cf..8df57cb8f0105d623ecd463dc98e075847c180d4 100644 --- a/montecarlo/vmc/inc/TVirtualMC.h +++ b/montecarlo/vmc/inc/TVirtualMC.h @@ -24,6 +24,7 @@ #include "TMCProcess.h" #include "TMCParticleType.h" #include "TMCOptical.h" +#include "TMCtls.h" #include "TVirtualMCApplication.h" #include "TVirtualMCStack.h" #include "TVirtualMCDecayer.h" @@ -32,10 +33,6 @@ #include "TString.h" #include "TError.h" -#if defined(__linux__) && !defined(__CINT__) -#include <pthread.h> -#endif - class TLorentzVector; class TGeoHMatrix; class TArrayI; @@ -866,10 +863,10 @@ private: TVirtualMC(const TVirtualMC &mc); TVirtualMC & operator=(const TVirtualMC &); -#if defined(__linux__) && !defined(__CINT__) - static __thread TVirtualMC* fgMC; // Monte Carlo singleton instance +#if !defined(__CINT__) + static TMCThreadLocal TVirtualMC* fgMC; // Monte Carlo singleton instance #else - static TVirtualMC* fgMC; // Monte Carlo singleton instance + static TVirtualMC* fgMC; // Monte Carlo singleton instance #endif TVirtualMCStack* fStack; //! Particles stack @@ -880,10 +877,10 @@ private: ClassDef(TVirtualMC,1) //Interface to Monte Carlo }; -#if defined(__linux__) && !defined(__CINT__) -R__EXTERN __thread TVirtualMC *gMC; +#if !defined(__CINT__) +R__EXTERN TMCThreadLocal TVirtualMC *gMC; #else -R__EXTERN TVirtualMC *gMC; +R__EXTERN TVirtualMC *gMC; #endif #endif //ROOT_TVirtualMC diff --git a/montecarlo/vmc/inc/TVirtualMCApplication.h b/montecarlo/vmc/inc/TVirtualMCApplication.h index cb1727400e6eb6ecfeb167e6a0fc61a2fe541516..07594afb6893cda5e8a5b8979004f3a2bd16f75a 100644 --- a/montecarlo/vmc/inc/TVirtualMCApplication.h +++ b/montecarlo/vmc/inc/TVirtualMCApplication.h @@ -25,9 +25,7 @@ #include "TMath.h" #endif -#if defined(__linux__) && !defined(__CINT__) -#include <pthread.h> -#endif +#include "TMCtls.h" class TVirtualMCApplication : public TNamed { @@ -112,10 +110,10 @@ public: private: // static data members -#if defined(__linux__) && !defined(__CINT__) - static __thread TVirtualMCApplication* fgInstance; // singleton instance +#if !defined(__CINT__) + static TMCThreadLocal TVirtualMCApplication* fgInstance; // singleton instance #else - static TVirtualMCApplication* fgInstance; // singleton instance + static TVirtualMCApplication* fgInstance; // singleton instance #endif ClassDef(TVirtualMCApplication,1) //Interface to MonteCarlo application diff --git a/montecarlo/vmc/src/TVirtualMC.cxx b/montecarlo/vmc/src/TVirtualMC.cxx index b0bbbebec757f15eca26a464f48fca5014a3c38e..678427a8d4426988e67d263b65d2bfb0a7870740 100644 --- a/montecarlo/vmc/src/TVirtualMC.cxx +++ b/montecarlo/vmc/src/TVirtualMC.cxx @@ -26,13 +26,8 @@ ClassImp(TVirtualMC) -#if defined(__linux__) && !defined(__CINT__) -__thread TVirtualMC* TVirtualMC::fgMC=0; -__thread TVirtualMC* gMC; -#else -TVirtualMC* TVirtualMC::fgMC=0; -TVirtualMC* gMC; -#endif +TMCThreadLocal TVirtualMC* TVirtualMC::fgMC=0; +TMCThreadLocal TVirtualMC* gMC; //_____________________________________________________________________________ TVirtualMC::TVirtualMC(const char *name, const char *title, diff --git a/montecarlo/vmc/src/TVirtualMCApplication.cxx b/montecarlo/vmc/src/TVirtualMCApplication.cxx index 0556c06dd07eb234501d090a7cbaffcca1b8042a..003392b0f6f7eab5f71241fdbc83e702c293fa07 100644 --- a/montecarlo/vmc/src/TVirtualMCApplication.cxx +++ b/montecarlo/vmc/src/TVirtualMCApplication.cxx @@ -20,11 +20,7 @@ ClassImp(TVirtualMCApplication) -#if defined(__linux__) && !defined(__CINT__) -__thread TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0; -#else -TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0; -#endif +TMCThreadLocal TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0; //_____________________________________________________________________________ TVirtualMCApplication::TVirtualMCApplication(const char *name,