diff --git a/montecarlo/vmc/inc/TVirtualMC.h b/montecarlo/vmc/inc/TVirtualMC.h index 7658acb747ec5af29825b8cf66aa8422a852dc58..e7135d8930bc66376f44a859d2b241f2627cbdf0 100644 --- a/montecarlo/vmc/inc/TVirtualMC.h +++ b/montecarlo/vmc/inc/TVirtualMC.h @@ -32,6 +32,10 @@ #include "TString.h" #include "TError.h" +#if defined(__linux__) && !defined(__CINT__) +#include <pthread.h> +#endif + class TLorentzVector; class TGeoHMatrix; class TArrayI; @@ -479,7 +483,7 @@ public: virtual Bool_t DefineParticle(Int_t pdg, const char* name, TMCParticleType mcType, Double_t mass, Double_t charge, Double_t lifetime) = 0; - + // Set a user defined particle // Function is ignored if particle with specified pdg // already exists and error report is printed. @@ -797,7 +801,10 @@ public: // Initialize MC virtual void Init() = 0; - // Initialize MC physics + // Initialize MC in a multi-threaded application + virtual void InitMT(Int_t threadRank); + + // Initialize MC physics virtual void BuildPhysics() = 0; // Process one event @@ -860,7 +867,11 @@ private: TVirtualMC(const TVirtualMC &mc); TVirtualMC & operator=(const TVirtualMC &); - static TVirtualMC* fgMC; // Monte Carlo singleton instance +#if defined(__linux__) && !defined(__CINT__) + static __thread TVirtualMC* fgMC; // Monte Carlo singleton instance +#else + static TVirtualMC* fgMC; // Monte Carlo singleton instance +#endif TVirtualMCStack* fStack; //! Particles stack TVirtualMCDecayer* fDecayer; //! External decayer @@ -889,7 +900,16 @@ inline Bool_t TVirtualMC::GetMaterial(Int_t /*imat*/, TString& /*name*/, return kFALSE; } -R__EXTERN TVirtualMC *gMC; +inline void TVirtualMC::InitMT(Int_t /*threadRank*/) { + // Initialize MC in a multi-threaded application + Warning("InitMT(Int_t threadRank)", "New function - not yet implemented."); +} + +#if defined(__linux__) && !defined(__CINT__) +R__EXTERN __thread TVirtualMC *gMC; +#else +R__EXTERN TVirtualMC *gMC; +#endif #endif //ROOT_TVirtualMC diff --git a/montecarlo/vmc/inc/TVirtualMCApplication.h b/montecarlo/vmc/inc/TVirtualMCApplication.h index 685855a2aaf580b998134153745406a4fb1ba2b5..9d12b5a3cd46befd476c05d51ecacd4e88a90a22 100644 --- a/montecarlo/vmc/inc/TVirtualMCApplication.h +++ b/montecarlo/vmc/inc/TVirtualMCApplication.h @@ -25,6 +25,10 @@ #include "TMath.h" #endif +#if defined(__linux__) && !defined(__CINT__) +#include <pthread.h> +#endif + class TVirtualMCApplication : public TNamed { public: @@ -101,7 +105,11 @@ public: private: // static data members - static TVirtualMCApplication* fgInstance; // singleton instance +#if defined(__linux__) && !defined(__CINT__) + static __thread TVirtualMCApplication* fgInstance; // singleton instance +#else + 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 04e826936c10b6e17e34643136fd838a2fa79ed1..576ac169438f01addc7e3e796928148f879722a1 100644 --- a/montecarlo/vmc/src/TVirtualMC.cxx +++ b/montecarlo/vmc/src/TVirtualMC.cxx @@ -26,8 +26,13 @@ ClassImp(TVirtualMC) +#if defined(__linux__) && !defined(__CINT__) +__thread TVirtualMC* TVirtualMC::fgMC=0; +__thread TVirtualMC* gMC; +#else TVirtualMC* TVirtualMC::fgMC=0; TVirtualMC* gMC; +#endif //_____________________________________________________________________________ TVirtualMC::TVirtualMC(const char *name, const char *title, diff --git a/montecarlo/vmc/src/TVirtualMCApplication.cxx b/montecarlo/vmc/src/TVirtualMCApplication.cxx index dd5c3c4e643fcf40ca3cd6dfda92918431122794..0556c06dd07eb234501d090a7cbaffcca1b8042a 100644 --- a/montecarlo/vmc/src/TVirtualMCApplication.cxx +++ b/montecarlo/vmc/src/TVirtualMCApplication.cxx @@ -20,7 +20,11 @@ ClassImp(TVirtualMCApplication) +#if defined(__linux__) && !defined(__CINT__) +__thread TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0; +#else TVirtualMCApplication* TVirtualMCApplication::fgInstance = 0; +#endif //_____________________________________________________________________________ TVirtualMCApplication::TVirtualMCApplication(const char *name,