mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: memory management for exprResultGlobals via objectRegistry
- replaces previous code that used an autoPtr to hold a singleton. In some circumstances this deletion would conflict with clearing the objectRegistry - leading to error messages on exit. Now store directly on the registry (similar to a MeshObject)
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
||||||
Copyright (C) 2019 OpenCFD Ltd.
|
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -41,7 +41,7 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
namespace expressions
|
namespace expressions
|
||||||
{
|
{
|
||||||
defineTypeNameAndDebug(exprResultDelayed, 0);
|
defineTypeName(exprResultDelayed);
|
||||||
|
|
||||||
addToRunTimeSelectionTable
|
addToRunTimeSelectionTable
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
||||||
Copyright (C) 2019 OpenCFD Ltd.
|
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -106,12 +106,12 @@ protected:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("exprResultDelayed");
|
TypeNameNoDebug("exprResultDelayed");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct null
|
//- Default construct
|
||||||
exprResultDelayed();
|
exprResultDelayed();
|
||||||
|
|
||||||
//- Copy construct
|
//- Copy construct
|
||||||
|
|||||||
@ -36,16 +36,12 @@ namespace Foam
|
|||||||
namespace expressions
|
namespace expressions
|
||||||
{
|
{
|
||||||
|
|
||||||
defineTypeNameAndDebug(exprResultGlobals, 0);
|
defineTypeName(exprResultGlobals);
|
||||||
|
|
||||||
} // End namespace expressions
|
} // End namespace expressions
|
||||||
} // End namespace Foam
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
Foam::autoPtr<Foam::expressions::exprResultGlobals>
|
|
||||||
Foam::expressions::exprResultGlobals::singleton_;
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::expressions::exprResultGlobals::exprResultGlobals
|
Foam::expressions::exprResultGlobals::exprResultGlobals
|
||||||
@ -57,32 +53,28 @@ Foam::expressions::exprResultGlobals::exprResultGlobals
|
|||||||
(
|
(
|
||||||
IOobject
|
IOobject
|
||||||
(
|
(
|
||||||
"exprResultGlobals",
|
exprResultGlobals::typeName,
|
||||||
obr.time().timeName(),
|
obr.time().timeName(), // instance
|
||||||
"expressions",
|
"expressions", // local
|
||||||
obr.time(),
|
obr.time(),
|
||||||
IOobject::READ_IF_PRESENT,
|
IOobject::READ_IF_PRESENT,
|
||||||
IOobject::AUTO_WRITE
|
IOobject::AUTO_WRITE,
|
||||||
|
true // register
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
variables_(),
|
||||||
timeIndex_(obr.time().timeIndex())
|
timeIndex_(obr.time().timeIndex())
|
||||||
{
|
{
|
||||||
if (headerOk())
|
if (headerOk())
|
||||||
{
|
{
|
||||||
readData
|
readData
|
||||||
(
|
(
|
||||||
readStream("exprResultGlobals", true)
|
readStream(exprResultGlobals::typeName, true)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResultGlobals::Table::Table()
|
|
||||||
:
|
|
||||||
HashPtrTable<exprResult>()
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResultGlobals::Table::Table(const Table& tbl)
|
Foam::expressions::exprResultGlobals::Table::Table(const Table& tbl)
|
||||||
:
|
:
|
||||||
HashPtrTable<exprResult>(tbl.capacity())
|
HashPtrTable<exprResult>(tbl.capacity())
|
||||||
@ -120,6 +112,52 @@ void Foam::expressions::exprResultGlobals::reset()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::expressions::exprResultGlobals&
|
||||||
|
Foam::expressions::exprResultGlobals::New
|
||||||
|
(
|
||||||
|
const objectRegistry& obr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
typedef expressions::exprResultGlobals Type;
|
||||||
|
|
||||||
|
auto* ptr = obr.time().getObjectPtr<Type>(Type::typeName);
|
||||||
|
|
||||||
|
if (!ptr)
|
||||||
|
{
|
||||||
|
ptr = new Type(obr);
|
||||||
|
ptr->store();
|
||||||
|
}
|
||||||
|
else if (ptr->timeIndex_ != obr.time().timeIndex())
|
||||||
|
{
|
||||||
|
// If time changes, reset variables
|
||||||
|
|
||||||
|
ptr->timeIndex_ = obr.time().timeIndex();
|
||||||
|
ptr->reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
return *ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::expressions::exprResultGlobals::Delete(const objectRegistry& obr)
|
||||||
|
{
|
||||||
|
typedef expressions::exprResultGlobals Type;
|
||||||
|
|
||||||
|
auto* ptr = obr.time().getObjectPtr<Type>(Type::typeName);
|
||||||
|
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
return obr.time().checkOut(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
bool Foam::expressions::exprResultGlobals::writeData(Ostream& os) const
|
bool Foam::expressions::exprResultGlobals::writeData(Ostream& os) const
|
||||||
@ -148,29 +186,6 @@ bool Foam::expressions::exprResultGlobals::readData(Istream& is)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResultGlobals&
|
|
||||||
Foam::expressions::exprResultGlobals::New
|
|
||||||
(
|
|
||||||
const objectRegistry& obr
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (!singleton_)
|
|
||||||
{
|
|
||||||
singleton_.reset(new exprResultGlobals(obr));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (singleton_->timeIndex_ != obr.time().timeIndex())
|
|
||||||
{
|
|
||||||
// Time changes, reset variables
|
|
||||||
|
|
||||||
singleton_->timeIndex_ = obr.time().timeIndex();
|
|
||||||
singleton_->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
return *singleton_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResultGlobals::Table&
|
Foam::expressions::exprResultGlobals::Table&
|
||||||
Foam::expressions::exprResultGlobals::getNamespace(const word& name)
|
Foam::expressions::exprResultGlobals::getNamespace(const word& name)
|
||||||
{
|
{
|
||||||
@ -187,11 +202,11 @@ Foam::expressions::exprResultGlobals::get
|
|||||||
{
|
{
|
||||||
for (const word& scopeName : scopes)
|
for (const word& scopeName : scopes)
|
||||||
{
|
{
|
||||||
const auto tableIter = variables_.find(scopeName);
|
const auto tableIter = variables_.cfind(scopeName);
|
||||||
|
|
||||||
if (tableIter.found())
|
if (tableIter.found())
|
||||||
{
|
{
|
||||||
const auto resultIter = (*tableIter).find(name);
|
const auto resultIter = (*tableIter).cfind(name);
|
||||||
|
|
||||||
if (resultIter.found())
|
if (resultIter.found())
|
||||||
{
|
{
|
||||||
@ -239,26 +254,6 @@ Foam::expressions::exprResultGlobals::addValue
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResult&
|
|
||||||
Foam::expressions::exprResultGlobals::addValue
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const word& scope,
|
|
||||||
autoPtr<exprResult>& value,
|
|
||||||
const bool overwrite
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Table& tbl = getOrCreateScope(scope);
|
|
||||||
|
|
||||||
if (overwrite || !tbl.found(name))
|
|
||||||
{
|
|
||||||
tbl.set(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return *tbl[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::expressions::exprResult&
|
Foam::expressions::exprResult&
|
||||||
Foam::expressions::exprResultGlobals::addValue
|
Foam::expressions::exprResultGlobals::addValue
|
||||||
(
|
(
|
||||||
@ -272,7 +267,7 @@ Foam::expressions::exprResultGlobals::addValue
|
|||||||
|
|
||||||
if (overwrite || !tbl.found(name))
|
if (overwrite || !tbl.found(name))
|
||||||
{
|
{
|
||||||
tbl.set(name, value);
|
tbl.set(name, std::move(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
return *tbl[name];
|
return *tbl[name];
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
||||||
Copyright (C) 2019 OpenCFD Ltd.
|
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -28,7 +28,12 @@ Class
|
|||||||
Foam::expressions::exprResultGlobals
|
Foam::expressions::exprResultGlobals
|
||||||
|
|
||||||
Description
|
Description
|
||||||
A globally available registry of expression results
|
A globally available registry of expression results.
|
||||||
|
These are currently registered on Time (may change in the future).
|
||||||
|
|
||||||
|
Note
|
||||||
|
The storage mechanism is similar to a MeshObject, but always stores
|
||||||
|
on Time and flushes stale values according to the time index.
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
exprResultGlobals.C
|
exprResultGlobals.C
|
||||||
@ -69,10 +74,17 @@ public:
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Table();
|
//- Default construct
|
||||||
|
Table() = default;
|
||||||
|
|
||||||
|
//- Copy (clone) construct
|
||||||
Table(const Table& tbl);
|
Table(const Table& tbl);
|
||||||
|
|
||||||
|
//- Move construct
|
||||||
Table(Table&& tbl);
|
Table(Table&& tbl);
|
||||||
Table(Istream& is);
|
|
||||||
|
//- Read construct from stream
|
||||||
|
explicit Table(Istream& is);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -86,13 +98,10 @@ private:
|
|||||||
//- The currently (or previously) used time-index
|
//- The currently (or previously) used time-index
|
||||||
label timeIndex_;
|
label timeIndex_;
|
||||||
|
|
||||||
//- Only one instance of this repository
|
|
||||||
static autoPtr<exprResultGlobals> singleton_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Construct
|
//- Construct on Time for registry
|
||||||
explicit exprResultGlobals(const objectRegistry& obr);
|
explicit exprResultGlobals(const objectRegistry& obr);
|
||||||
|
|
||||||
//- Reset all variables
|
//- Reset all variables
|
||||||
@ -108,14 +117,17 @@ private:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("exprResultGlobals");
|
TypeNameNoDebug("exprResultGlobals");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Selectors
|
||||||
|
|
||||||
//- Get the singleton
|
//- Static constructor for singleton
|
||||||
static exprResultGlobals& New(const objectRegistry& obr);
|
static exprResultGlobals& New(const objectRegistry& obr);
|
||||||
|
|
||||||
|
//- Static destructor for singleton
|
||||||
|
static bool Delete(const objectRegistry& obr);
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
virtual ~exprResultGlobals() = default;
|
virtual ~exprResultGlobals() = default;
|
||||||
@ -143,15 +155,6 @@ public:
|
|||||||
const bool overwrite = true
|
const bool overwrite = true
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Add named result to specified scope
|
|
||||||
exprResult& addValue
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const word& scope,
|
|
||||||
autoPtr<exprResult>& value,
|
|
||||||
const bool overwrite = true
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Add named result to specified scope
|
//- Add named result to specified scope
|
||||||
exprResult& addValue
|
exprResult& addValue
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
Copyright (C) 2012-2018 Bernhard Gschaider <bgschaid@hfd-research.com>
|
||||||
Copyright (C) 2019 OpenCFD Ltd.
|
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -35,7 +35,7 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
namespace expressions
|
namespace expressions
|
||||||
{
|
{
|
||||||
defineTypeNameAndDebug(exprResultStored, 0);
|
defineTypeName(exprResultStored);
|
||||||
|
|
||||||
addToRunTimeSelectionTable
|
addToRunTimeSelectionTable
|
||||||
(
|
(
|
||||||
|
|||||||
@ -84,7 +84,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("exprResultStored");
|
TypeNameNoDebug("exprResultStored");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|||||||
@ -36,7 +36,7 @@ namespace Foam
|
|||||||
namespace expressions
|
namespace expressions
|
||||||
{
|
{
|
||||||
|
|
||||||
defineTypeNameAndDebug(exprResultStoredStack,0);
|
defineTypeName(exprResultStoredStack);
|
||||||
|
|
||||||
addToRunTimeSelectionTable
|
addToRunTimeSelectionTable
|
||||||
(
|
(
|
||||||
|
|||||||
@ -66,7 +66,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("exprResultStoredStack");
|
TypeNameNoDebug("exprResultStoredStack");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|||||||
Reference in New Issue
Block a user