diff --git a/geom/geom/inc/TGeoManager.h b/geom/geom/inc/TGeoManager.h index 861831089d280a3759788fe8eb99bf085859744d..b871bcb58a452b2e4620b1ab4f01a8d5076ffc39 100644 --- a/geom/geom/inc/TGeoManager.h +++ b/geom/geom/inc/TGeoManager.h @@ -116,11 +116,7 @@ private : TGeoElementTable *fElementTable; //! table of elements Int_t *fNodeIdArray; //! array of node id's - Int_t fIntSize; //! int buffer size - Int_t fDblSize; //! dbl buffer size - Int_t *fIntBuffer; //! transient int buffer Int_t fNLevel; // maximum accepted level in geometry - Double_t *fDblBuffer; //! transient dbl buffer TGeoVolume *fPaintVolume; //! volume currently painted THashList *fHashVolumes; //! hash list of volumes providing fast search THashList *fHashGVolumes; //! hash list of group volumes providing fast search @@ -147,6 +143,22 @@ public: TGeoManager(const char *name, const char *title); // destructor virtual ~TGeoManager(); + struct ThreadData_t + { + Int_t fIntSize; //! int buffer size + Int_t fDblSize; //! dbl buffer size + Int_t *fIntBuffer; //! transient int buffer + Double_t *fDblBuffer; //! transient dbl buffer + + ThreadData_t(); + ~ThreadData_t(); + }; + + mutable std::vector<ThreadData_t*> fThreadData; //! Thread private data + mutable Int_t fThreadSize; //! Length of thread data + + ThreadData_t& GetThreadData() const; + void ClearThreadData() const; //--- adding geometrical objects Int_t AddMaterial(const TGeoMaterial *material); Int_t AddOverlap(const TNamed *ovlp); @@ -410,6 +422,7 @@ public: void CleanGarbage(); void ClearShape(const TGeoShape *shape); void ClearTracks() {fTracks->Delete(); fNtracks=0;} + void ClearNavigators(); void RemoveMaterial(Int_t index); void ResetUserData(); diff --git a/geom/geom/src/TGeoManager.cxx b/geom/geom/src/TGeoManager.cxx index cf04ac17246f28ba8b3e27b5cda60bc1093de96e..e1b8780e012b8c38ca7c46f8f99811e8460e7cc3 100644 --- a/geom/geom/src/TGeoManager.cxx +++ b/geom/geom/src/TGeoManager.cxx @@ -328,6 +328,56 @@ Int_t TGeoManager::fgVerboseLevel = 1; Int_t TGeoManager::fgNumThreads = 0; TGeoManager::ThreadsMap_t TGeoManager::fgThreadId; +//______________________________________________________________________________ +TGeoManager::ThreadData_t::ThreadData_t() : + fIntSize(0), fDblSize(0), fIntBuffer(0), fDblBuffer(0) +{ + // Constructor. +} + +//______________________________________________________________________________ +TGeoManager::ThreadData_t::~ThreadData_t() +{ + // Destructor. + + delete [] fIntBuffer; + delete [] fDblBuffer; +} + +//______________________________________________________________________________ +TGeoManager::ThreadData_t& TGeoManager::GetThreadData() const +{ + Int_t tid = TGeoManager::ThreadId(); + TThread::Lock(); + if (tid >= fThreadSize) + { + fThreadData.resize(tid + 1); + fThreadSize = tid + 1; + } + if (fThreadData[tid] == 0) + { + fThreadData[tid] = new ThreadData_t; + } + TThread::UnLock(); + return *fThreadData[tid]; +} + +//______________________________________________________________________________ +void TGeoManager::ClearThreadData() const +{ + std::vector<ThreadData_t*>::iterator i = fThreadData.begin(); + while (i != fThreadData.end()) + { + delete *i; + ++i; + } + fThreadData.clear(); + fThreadSize = 0; + TIter next(fVolumes); + TGeoVolume *vol; + while ((vol=(TGeoVolume*)next())) vol->ClearThreadData(); +} + //_____________________________________________________________________________ TGeoManager::TGeoManager() { @@ -382,9 +432,6 @@ TGeoManager::TGeoManager() fUniqueVolumes = 0; fNodeIdArray = 0; fClippingShape = 0; - fIntSize = fDblSize = 1000; - fIntBuffer = 0; - fDblBuffer = 0; fMatrixTransform = kFALSE; fMatrixReflection = kFALSE; fGLMatrix = 0; @@ -398,6 +445,7 @@ TGeoManager::TGeoManager() fValuePNEId = 0; fMultiThread = kFALSE; ClearThreadsMap(); + fThreadSize = 0; } else { Init(); gGeoIdentity = 0; @@ -478,9 +526,6 @@ void TGeoManager::Init() fUniqueVolumes = new TObjArray(256); fNodeIdArray = 0; fClippingShape = 0; - fIntSize = fDblSize = 1000; - fIntBuffer = new Int_t[1000]; - fDblBuffer = new Double_t[1000]; fMatrixTransform = kFALSE; fMatrixReflection = kFALSE; fGLMatrix = new TGeoHMatrix(); @@ -494,6 +539,7 @@ void TGeoManager::Init() fValuePNEId = 0; fMultiThread = kFALSE; ClearThreadsMap(); + fThreadSize = 0; } //_____________________________________________________________________________ @@ -549,11 +595,7 @@ TGeoManager::TGeoManager(const TGeoManager& gm) : fClippingShape(gm.fClippingShape), fElementTable(gm.fElementTable), fNodeIdArray(gm.fNodeIdArray), - fIntSize(gm.fIntSize), - fDblSize(gm.fDblSize), - fIntBuffer(gm.fIntBuffer), fNLevel(gm.fNLevel), - fDblBuffer(gm.fDblBuffer), fPaintVolume(gm.fPaintVolume), fHashVolumes(gm.fHashVolumes), fHashGVolumes(gm.fHashGVolumes), @@ -563,7 +605,8 @@ TGeoManager::TGeoManager(const TGeoManager& gm) : fNPNEId(0), fKeyPNEId(0), fValuePNEId(0), - fMultiThread(kFALSE) + fMultiThread(kFALSE), + fThreadSize(0) { //copy constructor for(Int_t i=0; i<256; i++) @@ -629,11 +672,7 @@ TGeoManager& TGeoManager::operator=(const TGeoManager& gm) fClippingShape=gm.fClippingShape; fElementTable=gm.fElementTable; fNodeIdArray=gm.fNodeIdArray; - fIntSize=gm.fIntSize; - fDblSize=gm.fDblSize; - fIntBuffer=gm.fIntBuffer; fNLevel=gm.fNLevel; - fDblBuffer=gm.fDblBuffer; fPaintVolume=gm.fPaintVolume; fHashVolumes=gm.fHashVolumes; fHashGVolumes=gm.fHashGVolumes; @@ -645,6 +684,7 @@ TGeoManager& TGeoManager::operator=(const TGeoManager& gm) fValuePNEId = 0; fMultiThread = kFALSE; ClearThreadsMap(); + ClearThreadData(); } return *this; } @@ -663,6 +703,7 @@ TGeoManager::~TGeoManager() // TIter next(brlist); // TBrowser *browser = 0; // while ((browser=(TBrowser*)next())) browser->RecursiveRemove(this); + ClearThreadData(); delete TGeoBuilder::Instance(this); if (fBits) delete [] fBits; SafeDelete(fNodes); @@ -682,17 +723,15 @@ TGeoManager::~TGeoManager() if (fTracks) {fTracks->Delete(); SafeDelete( fTracks );} SafeDelete( fUniqueVolumes ); if (fPdgNames) {fPdgNames->Delete(); SafeDelete( fPdgNames );} -// if (fNavigators) {fNavigators->Delete(); SafeDelete( fNavigators );} + ClearNavigators(); CleanGarbage(); SafeDelete( fPainter ); - delete [] fDblBuffer; - delete [] fIntBuffer; SafeDelete( fGLMatrix ); if (fSizePNEId) { delete [] fKeyPNEId; delete [] fValuePNEId; } -// ClearThreadsMap(); + ClearThreadsMap(); gGeoIdentity = 0; gGeoManager = 0; } @@ -857,6 +896,17 @@ Bool_t TGeoManager::SetCurrentNavigator(Int_t index) if (!fMultiThread) fCurrentNavigator = nav; return kTRUE; } +//_____________________________________________________________________________ +void TGeoManager::ClearNavigators() +{ +// Clear all navigators. + for (NavigatorsMap_t::const_iterator it = fNavigators.begin(); + it != fNavigators.end(); it++) { + TGeoNavigatorArray *arr = it->second; + if (arr) delete arr; + } + fNavigators.clear(); +} //_____________________________________________________________________________ void TGeoManager::ClearThreadsMap() @@ -3549,24 +3599,26 @@ Bool_t TGeoManager::InitArrayPNE() const Int_t *TGeoManager::GetIntBuffer(Int_t length) { // Get a temporary buffer of Int_t* - if (length>fIntSize) { - delete [] fIntBuffer; - fIntBuffer = new Int_t[length]; - fIntSize = length; + ThreadData_t &td = GetThreadData(); + if (length>td.fIntSize) { + delete [] td.fIntBuffer; + td.fIntBuffer = new Int_t[length]; + td.fIntSize = length; } - return fIntBuffer; + return td.fIntBuffer; } //______________________________________________________________________________ Double_t *TGeoManager::GetDblBuffer(Int_t length) { // Get a temporary buffer of Double_t* - if (length>fDblSize) { - delete [] fDblBuffer; - fDblBuffer = new Double_t[length]; - fDblSize = length; + ThreadData_t &td = GetThreadData(); + if (length>td.fDblSize) { + delete [] td.fDblBuffer; + td.fDblBuffer = new Double_t[length]; + td.fDblSize = length; } - return fDblBuffer; + return td.fDblBuffer; } //______________________________________________________________________________ diff --git a/geom/geom/src/TGeoNavigator.cxx b/geom/geom/src/TGeoNavigator.cxx index 27d6f329d6556dd8cc87199ee16b2a495feadf08..5dcc6908c964b1da6ae99ef034695668aa30dad7 100644 --- a/geom/geom/src/TGeoNavigator.cxx +++ b/geom/geom/src/TGeoNavigator.cxx @@ -2405,6 +2405,7 @@ ClassImp(TGeoNavigatorArray) TGeoNavigator *TGeoNavigatorArray::AddNavigator() { // Add a new navigator to the array. + SetOwner(kTRUE); TGeoNavigator *nav = new TGeoNavigator(fGeoManager); nav->BuildCache(kTRUE, kFALSE); Add(nav); diff --git a/geom/geom/src/TGeoVolume.cxx b/geom/geom/src/TGeoVolume.cxx index 311812b01793e889a2d9486a3433f7de434af372..9ce6da0ba736791fe2b90811964f5dd60ae4c512 100644 --- a/geom/geom/src/TGeoVolume.cxx +++ b/geom/geom/src/TGeoVolume.cxx @@ -363,6 +363,7 @@ void TGeoVolume::ClearThreadData() const { if (fFinder) fFinder->ClearThreadData(); if (fVoxels) fVoxels->ClearThreadData(); + if (fShape) fShape->ClearThreadData(); } //_____________________________________________________________________________ @@ -2554,8 +2555,8 @@ TGeoVolumeAssembly::TGeoVolumeAssembly(const char *name) TGeoVolumeAssembly::~TGeoVolumeAssembly() { // Destructor. The assembly is owner of its "shape". - if (fShape) delete fShape; ClearThreadData(); + if (fShape) delete fShape; } //_____________________________________________________________________________