Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

BUG: dlLibraryTable: guarantee dlclose order opposite of dlopen order

  • Loading branch information...
commit 14297916c9df00996e5a4a650cb82da47b5b5f50 1 parent 3a5564a
mattijs authored
View
62 src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C
@@ -35,8 +35,6 @@ defineTypeNameAndDebug(Foam::dlLibraryTable, 0);
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::dlLibraryTable::dlLibraryTable()
-:
- HashTable<fileName, void*, Hash<void*> >()
{}
@@ -45,8 +43,6 @@ Foam::dlLibraryTable::dlLibraryTable
const dictionary& dict,
const word& libsEntry
)
-:
- HashTable<fileName, void*, Hash<void*> >()
{
open(dict, libsEntry);
}
@@ -56,17 +52,18 @@ Foam::dlLibraryTable::dlLibraryTable
Foam::dlLibraryTable::~dlLibraryTable()
{
- forAllConstIter(dlLibraryTable, *this, iter)
+ forAllReverse(libPtrs_, i)
{
- // bug in dlclose - does not call static destructors of
- // loaded library when actually unloading the library.
- // See https://bugzilla.novell.com/show_bug.cgi?id=680125 and 657627.
- if (debug)
+ if (libPtrs_[i])
{
- Info<< "dlLibraryTable::~dlLibraryTable() : closing " << iter()
- << " with handle " << long(iter.key()) << endl;
+ if (debug)
+ {
+ Info<< "dlLibraryTable::~dlLibraryTable() : closing "
+ << libNames_[i]
+ << " with handle " << long(libPtrs_[i]) << endl;
+ }
+ dlClose(libPtrs_[i]);
}
- dlClose(iter.key());
}
}
@@ -95,7 +92,7 @@ bool Foam::dlLibraryTable::open
{
WarningIn
(
- "dlLibraryTable::open(const fileName&)"
+ "dlLibraryTable::open(const fileName&, const bool)"
) << "could not load " << functionLibName
<< endl;
}
@@ -104,7 +101,9 @@ bool Foam::dlLibraryTable::open
}
else
{
- return insert(functionLibPtr, functionLibName);
+ libPtrs_.append(functionLibPtr);
+ libNames_.append(functionLibName);
+ return true;
}
}
else
@@ -120,18 +119,30 @@ bool Foam::dlLibraryTable::close
const bool verbose
)
{
- void* libPtr = findLibrary(functionLibName);
- if (libPtr)
+ label index = -1;
+ forAllReverse(libNames_, i)
+ {
+ if (libNames_[i] == functionLibName)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ if (index != -1)
{
if (debug)
{
Info<< "dlLibraryTable::close : closing " << functionLibName
- << " with handle " << long(libPtr) << endl;
+ << " with handle " << long(libPtrs_[index]) << endl;
}
- erase(libPtr);
+ bool ok = dlClose(libPtrs_[index]);
+
+ libPtrs_[index] = NULL;
+ libNames_[index] = fileName::null;
- if (!dlClose(libPtr))
+ if (!ok)
{
if (verbose)
{
@@ -153,13 +164,20 @@ bool Foam::dlLibraryTable::close
void* Foam::dlLibraryTable::findLibrary(const fileName& functionLibName)
{
- forAllConstIter(dlLibraryTable, *this, iter)
+ label index = -1;
+ forAllReverse(libNames_, i)
{
- if (iter() == functionLibName)
+ if (libNames_[i] == functionLibName)
{
- return iter.key();
+ index = i;
+ break;
}
}
+
+ if (index != -1)
+ {
+ return libPtrs_[index];
+ }
return NULL;
}
View
10 src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H
@@ -36,8 +36,7 @@ SourceFiles
#define dlLibraryTable_H
#include "label.H"
-#include "Hash.H"
-#include "HashTable.H"
+#include "DynamicList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -49,11 +48,14 @@ namespace Foam
\*---------------------------------------------------------------------------*/
class dlLibraryTable
-:
- public HashTable<fileName, void*, Hash<void*> >
{
// Private Member Functions
+ DynamicList<void*> libPtrs_;
+
+ DynamicList<fileName> libNames_;
+
+
//- Disallow default bitwise copy construct
dlLibraryTable(const dlLibraryTable&);
View
4 src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C
@@ -62,8 +62,8 @@ bool Foam::dlLibraryTable::open
WarningIn
(
"dlLibraryTable::open"
- "(const dictionary& dict, const word& libsEntry, "
- "const TablePtr tablePtr)"
+ "(const dictionary&, const word&, "
+ "const TablePtr&)"
) << "library " << libName
<< " did not introduce any new entries"
<< endl << endl;
Please sign in to comment.
Something went wrong with that request. Please try again.