Skip to content

Commit ede7137

Browse files
ChristianTackeGSIdennisklein
authored andcommitted
fix: Multiple Leaks around FairGeoLoader
Also some small other stylistic changes
1 parent eb804eb commit ede7137

6 files changed

Lines changed: 68 additions & 52 deletions

File tree

fairroot/base/steer/FairRunSim.cxx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -153,11 +153,11 @@ void FairRunSim::Init()
153153
// fOutFile=fRootManager->OpenOutFile(fOutname);
154154
LOG(info) << "============== FairRunSim: Initialising simulation run ==============";
155155

156-
auto loader = new FairGeoLoader(fLoaderName.Data(), "Geo Loader");
157-
FairGeoInterface* GeoInterFace = loader->getGeoInterface();
158-
GeoInterFace->SetNoOfSets(ListOfModules->GetEntries());
159-
GeoInterFace->setMediaFile(MatFname.Data());
160-
GeoInterFace->readMedia();
156+
fGeoLoader = std::make_unique<FairGeoLoader>(fLoaderName.Data(), "Geo Loader");
157+
FairGeoInterface* geointerFace = fGeoLoader->getGeoInterface();
158+
geointerFace->SetNoOfSets(ListOfModules->GetEntries());
159+
geointerFace->setMediaFile(MatFname.Data());
160+
geointerFace->readMedia();
161161

162162
// gSystem->cd(flout.Data());
163163

@@ -389,6 +389,9 @@ void FairRunSim::ls(Option_t* option) const
389389
{
390390
FairRun::ls(option);
391391
TROOT::IncreaseDirLevel();
392+
if (fGeoLoader) {
393+
fGeoLoader->ls(option);
394+
}
392395
#pragma GCC diagnostic push
393396
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
394397
if (fGen) {

fairroot/base/steer/FairRunSim.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -23,6 +23,7 @@
2323
#include <utility>
2424

2525
class FairField;
26+
class FairGeoLoader;
2627
class FairMCEventHeader;
2728
class FairMesh;
2829
class FairModule;
@@ -223,6 +224,8 @@ class FairRunSim : public FairRun
223224

224225
bool fWasMT{false}; //! /** Actual MT mode used */
225226

227+
std::unique_ptr<FairGeoLoader> fGeoLoader; //!
228+
226229
protected:
227230
Int_t count{0}; //!< Internal counter
228231
FairMCApplication* fApp{nullptr}; //!< Main VMC application

fairroot/geobase/FairGeoLoader.cxx

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -29,42 +29,44 @@ FairGeoLoader* FairGeoLoader::fgInstance = nullptr;
2929

3030
FairGeoLoader* FairGeoLoader::Instance() { return fgInstance; }
3131

32+
static std::unique_ptr<FairGeoBuilder> MakeGeoBuilder(const char* Name)
33+
{
34+
if (strncmp(Name, "TGeo", 4) == 0) {
35+
auto geom = std::make_unique<TGeoManager>("FAIRGeom", "FAIR geometry");
36+
return std::make_unique<FairGeoRootBuilder>("TGeo builder", "geometry builder", std::move(geom));
37+
}
38+
39+
if (strncmp(Name, "G3Native", 8) == 0) {
40+
cout << "-I- FairGeoLoader() : Native G3 Geometry is used: This option is not supported any more!" << endl;
41+
exit(0);
42+
// gGeoManager = NULL;
43+
// fGeoBuilder=new FairGeoG3Builder("G3 builder","geometry builder");
44+
}
45+
46+
return {};
47+
}
48+
3249
FairGeoLoader::FairGeoLoader()
3350
: TNamed()
34-
, fInterface(NULL)
35-
, fGeoBuilder(NULL)
3651
{
3752
fgInstance = this;
3853
}
3954

4055
FairGeoLoader::FairGeoLoader(const char* Name, const char* title)
4156
: TNamed(Name, title)
42-
, fInterface(NULL)
43-
, fGeoBuilder(NULL)
57+
, fGeoBuilder(MakeGeoBuilder(Name))
4458
{
4559
if (fgInstance) {
4660
Fatal("FairGeoLoader", "Singleton instance already exists.");
4761
return;
4862
}
4963
fgInstance = this;
50-
fInterface = new FairGeoInterface;
51-
if (strncmp(Name, "TGeo", 4) == 0) {
52-
TGeoManager* geom = new TGeoManager("FAIRGeom", "FAIR geometry");
53-
fGeoBuilder = new FairGeoRootBuilder("TGeo builder", "geometry builder");
54-
(static_cast<FairGeoRootBuilder*>(fGeoBuilder))->setGeoManager(geom);
55-
} else if (strncmp(Name, "G3Native", 8) == 0) {
56-
cout << "-I- FairGeoLoader() : Native G3 Geometry is used: This option is not supported any more!" << endl;
57-
exit(0);
58-
// gGeoManager = NULL;
59-
// fGeoBuilder=new FairGeoG3Builder("G3 builder","geometry builder");
60-
}
6164

62-
fInterface->setGeomBuilder(fGeoBuilder);
65+
fInterface.setGeomBuilder(fGeoBuilder.get());
6366
}
6467

6568
FairGeoLoader::~FairGeoLoader()
6669
{
67-
delete fInterface;
6870
if (fgInstance == this) {
6971
// Do not point to a destructed object!
7072
fgInstance = nullptr;

fairroot/geobase/FairGeoLoader.h

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -16,34 +16,45 @@
1616
#ifndef FairGeoLOADER_H
1717
#define FairGeoLOADER_H
1818

19+
#include "FairGeoInterface.h"
20+
1921
#include <Rtypes.h> // for FairGeoLoader::Class, etc
2022
#include <TNamed.h> // for TNamed
23+
#include <memory>
2124

22-
class FairGeoInterface;
2325
class FairGeoBuilder;
24-
/**New Geometry Loader, this loader handel the Hades geometry description
25-
* @author Ilse koenig
26-
* @author M. Al-Turany*/
2726

27+
/**
28+
* New Geometry Loader, this loader handel the Hades geometry description
29+
* \ingroup geobase fairroot_singleton
30+
* @author Ilse koenig
31+
* @author M. Al-Turany
32+
*/
2833
class FairGeoLoader : public TNamed
2934
{
3035
public:
3136
FairGeoLoader(const char* Name, const char* title);
3237
FairGeoLoader();
3338
~FairGeoLoader() override;
34-
FairGeoInterface* getGeoInterface() { return fInterface; }
35-
FairGeoBuilder* getGeoBuilder() { return fGeoBuilder; }
39+
FairGeoInterface* getGeoInterface() { return &fInterface; }
40+
FairGeoBuilder* getGeoBuilder() { return fGeoBuilder.get(); }
3641
/** static access method*/
3742
static FairGeoLoader* Instance();
3843

3944
private:
4045
FairGeoLoader(const FairGeoLoader&);
4146
FairGeoLoader& operator=(const FairGeoLoader&);
4247
static FairGeoLoader* fgInstance; //! /**Singleton instance*/
43-
FairGeoInterface* fInterface; //! /** Hades Geometry Interface*/
44-
FairGeoBuilder* fGeoBuilder; //! /**Geometry builder*/
4548

46-
ClassDefOverride(FairGeoLoader, 1);
49+
std::unique_ptr<FairGeoBuilder> fGeoBuilder; //!< Geometry builder
50+
/**
51+
* \brief Geometry Interface
52+
* \note Must be destructed before `fGeoBuilder`,
53+
* so must be after that member variable.
54+
*/
55+
FairGeoInterface fInterface{}; //!
56+
57+
ClassDefOverride(FairGeoLoader, 0);
4758
};
4859

4960
#endif

fairroot/geobase/FairGeoRootBuilder.cxx

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -23,7 +23,6 @@
2323
#include "FairGeoVector.h" // for FairGeoVector
2424

2525
#include <TArrayD.h> // for TArrayD
26-
#include <TGeoManager.h> // for TGeoManager
2726
#include <TGeoMaterial.h> // for TGeoMixture, TGeoMaterial
2827
#include <TGeoMatrix.h> // for TGeoCombiTrans, etc
2928
#include <TGeoMedium.h> // for TGeoMedium
@@ -34,17 +33,16 @@
3433

3534
FairGeoRootBuilder::FairGeoRootBuilder()
3635
: FairGeoBuilder()
37-
, geoManager(nullptr)
38-
{
39-
// Default constructor
40-
}
36+
{}
4137

4238
FairGeoRootBuilder::FairGeoRootBuilder(const char* name, const char* title)
4339
: FairGeoBuilder(name, title)
44-
, geoManager(nullptr)
45-
{
46-
// Constructor
47-
}
40+
{}
41+
42+
FairGeoRootBuilder::FairGeoRootBuilder(const char* name, const char* title, std::unique_ptr<TGeoManager> geom)
43+
: FairGeoBuilder(name, title)
44+
, geoManager(std::move(geom))
45+
{}
4846

4947
Bool_t FairGeoRootBuilder::createNode(FairGeoNode* volu, Int_t hadFormat)
5048
{

fairroot/geobase/FairGeoRootBuilder.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/********************************************************************************
2-
* Copyright (C) 2014-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
2+
* Copyright (C) 2014-2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
33
* *
44
* This software is distributed under the terms of the *
55
* GNU Lesser General Public Licence (LGPL) version 3, *
@@ -10,30 +10,29 @@
1010

1111
#include "FairGeoBuilder.h" // for FairGeoBuilder
1212

13-
#include <Rtypes.h> // for FairGeoRootBuilder::Class, etc
13+
#include <TGeoManager.h>
1414

1515
class FairGeoMedium;
1616
class FairGeoNode;
17-
class TGeoManager;
1817

1918
/**
2019
* class to create geometry in ROOT
20+
* \ingroup geobase
2121
* @author M. Al-Turany
2222
*/
2323
class FairGeoRootBuilder : public FairGeoBuilder
2424
{
2525
private:
2626
FairGeoRootBuilder(const FairGeoRootBuilder&);
2727
FairGeoRootBuilder& operator=(const FairGeoRootBuilder&);
28-
29-
protected:
30-
TGeoManager* geoManager; // ROOT geometry manager
28+
std::unique_ptr<TGeoManager> geoManager; //!< ROOT geometry manager
3129

3230
public:
3331
FairGeoRootBuilder();
3432
FairGeoRootBuilder(const char*, const char*);
33+
FairGeoRootBuilder(const char*, const char*, std::unique_ptr<TGeoManager>);
3534
~FairGeoRootBuilder() override = default;
36-
void setGeoManager(TGeoManager* me) { geoManager = me; }
35+
[[deprecated]] void setGeoManager(TGeoManager* me) { geoManager.reset(me); }
3736
Bool_t createNode(FairGeoNode*, Int_t hadFormat = 0) override;
3837
Int_t createMedium(FairGeoMedium*) override;
3938
void finalize() override;

0 commit comments

Comments
 (0)