Commit d571e523 authored by Mark Olesen's avatar Mark Olesen
Browse files

ENH: detect excess tokens for "libs" entry (issue #762)

- this addresses issue #843
parent 511b3562
......@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -79,104 +79,92 @@ Foam::dlLibraryTable::~dlLibraryTable()
bool Foam::dlLibraryTable::open
(
const fileName& functionLibName,
const fileName& libName,
const bool verbose
)
{
if (functionLibName.size())
if (libName.empty())
{
void* functionLibPtr = dlOpen
(
fileName(functionLibName).expand(),
verbose
);
return false;
}
if (debug)
{
InfoInFunction
<< "Opened " << functionLibName
<< " resulting in handle " << uintptr_t(functionLibPtr) << endl;
}
void* ptr = dlOpen(fileName(libName).expand(), verbose);
if (!functionLibPtr)
{
if (verbose)
{
WarningInFunction
<< "could not load " << functionLibName
<< endl;
}
if (debug)
{
InfoInFunction
<< "Opened " << libName
<< " resulting in handle " << uintptr_t(ptr) << endl;
}
return false;
}
else
{
libPtrs_.append(functionLibPtr);
libNames_.append(functionLibName);
return true;
}
if (ptr)
{
libPtrs_.append(ptr);
libNames_.append(libName);
return true;
}
else
if (verbose)
{
return false;
WarningInFunction
<< "could not load " << libName
<< endl;
}
return false;
}
bool Foam::dlLibraryTable::close
(
const fileName& functionLibName,
const fileName& libName,
const bool verbose
)
{
label index = -1;
forAllReverse(libNames_, i)
{
if (libNames_[i] == functionLibName)
if (libName == libNames_[i])
{
index = i;
break;
}
}
if (index != -1)
if (index == -1)
{
if (debug)
{
InfoInFunction
<< "Closing " << functionLibName
<< " with handle " << uintptr_t(libPtrs_[index]) << endl;
}
return false;
}
bool ok = dlClose(libPtrs_[index]);
if (debug)
{
InfoInFunction
<< "Closing " << libName
<< " with handle " << uintptr_t(libPtrs_[index]) << endl;
}
libPtrs_[index] = nullptr;
libNames_[index] = fileName::null;
const bool ok = dlClose(libPtrs_[index]);
if (!ok)
{
if (verbose)
{
WarningInFunction
<< "could not close " << functionLibName
<< endl;
}
return false;
}
libPtrs_[index] = nullptr;
libNames_[index].clear();
return true;
if (!ok && verbose)
{
WarningInFunction
<< "could not close " << libName
<< endl;
}
return false;
return ok;
}
void* Foam::dlLibraryTable::findLibrary(const fileName& functionLibName)
void* Foam::dlLibraryTable::findLibrary(const fileName& libName)
{
label index = -1;
forAllReverse(libNames_, i)
{
if (libNames_[i] == functionLibName)
if (libName == libNames_[i])
{
index = i;
break;
......@@ -187,6 +175,7 @@ void* Foam::dlLibraryTable::findLibrary(const fileName& functionLibName)
{
return libPtrs_[index];
}
return nullptr;
}
......@@ -197,23 +186,20 @@ bool Foam::dlLibraryTable::open
const word& libsEntry
)
{
if (dict.found(libsEntry))
{
fileNameList libNames(dict.lookup(libsEntry));
fileNameList libNames;
dict.readIfPresent(libsEntry, libNames);
bool allOpened = !libNames.empty();
label nOpen = 0;
forAll(libNames, i)
for (const fileName& libName : libNames)
{
if (dlLibraryTable::open(libName))
{
allOpened = dlLibraryTable::open(libNames[i]) && allOpened;
++nOpen;
}
return allOpened;
}
else
{
return false;
}
return nOpen && nOpen == libNames.size();
}
......
......@@ -49,13 +49,15 @@ namespace Foam
class dlLibraryTable
{
// Private Member Functions
// Private data
DynamicList<void*> libPtrs_;
DynamicList<fileName> libNames_;
// Private Member Functions
//- No copy construct
dlLibraryTable(const dlLibraryTable&) = delete;
......@@ -73,9 +75,9 @@ public:
//- Construct null
dlLibraryTable();
//- Construct from dictionary and name of 'libs' entry giving
// the libraries to load
dlLibraryTable(const dictionary&, const word&);
//- Open all libraries listed in the 'libsEntry' entry in the
//- given dictionary.
dlLibraryTable(const dictionary& dict, const word& libsEntry);
//- Destructor
......@@ -85,25 +87,25 @@ public:
// Member Functions
//- Open the named library, optionally with warnings if problems occur
bool open(const fileName& name, const bool verbose = true);
bool open(const fileName& libName, const bool verbose = true);
//- Close the named library, optionally with warnings if problems occur
bool close(const fileName& name, const bool verbose = true);
bool close(const fileName& libName, const bool verbose = true);
//- Find the handle of the named library
void* findLibrary(const fileName& name);
void* findLibrary(const fileName& libName);
//- Open all the libraries listed in the 'libsEntry' entry in the
// given dictionary if present
bool open(const dictionary&, const word& libsEntry);
//- Open all libraries listed in the 'libsEntry' entry in the
//- given dictionary.
bool open(const dictionary& dict, const word& libsEntry);
//- Open all the libraries listed in the 'libsEntry' entry in the
// given dictionary if present and check the additions
// to the given constructor table
//- Open all libraries listed in the 'libsEntry' entry in the
//- given dictionary and check the additions
//- to the given constructor table
template<class TablePtr>
bool open
(
const dictionary&,
const dictionary& dict,
const word& libsEntry,
const TablePtr& tablePtr
);
......
......@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -37,47 +37,36 @@ bool Foam::dlLibraryTable::open
const TablePtr& tablePtr
)
{
if (dict.found(libsEntry))
{
fileNameList libNames(dict.lookup(libsEntry));
bool allOpened = (libNames.size() > 0);
fileNameList libNames;
dict.readIfPresent(libsEntry, libNames);
forAll(libNames, i)
{
const fileName& libName = libNames[i];
label nOpen = 0;
label nEntries = 0;
if (tablePtr)
{
nEntries = tablePtr->size();
}
for (const fileName& libName : libNames)
{
const label nEntries = (tablePtr ? tablePtr->size() : 0);
bool opened = dlLibraryTable::open(libName);
allOpened = opened && allOpened;
if (dlLibraryTable::open(libName))
{
++nOpen;
if (!opened)
{
WarningInFunction
<< "Could not open library " << libName
<< endl << endl;
}
else if (debug && (!tablePtr || tablePtr->size() <= nEntries))
if (debug && (!tablePtr || tablePtr->size() <= nEntries))
{
WarningInFunction
<< "library " << libName
<< " did not introduce any new entries"
<< endl << endl;
<< nl << endl;
}
}
return allOpened;
}
else
{
return false;
else
{
WarningInFunction
<< "Could not open library " << libName
<< nl << endl;
}
}
return nOpen && nOpen == libNames.size();
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment