From ba46d43be70d33472f798b879167063ff194e6e6 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Tue, 2 Aug 2011 12:50:14 +0100 Subject: [PATCH] BUG: dlLibraryTable: guarantee dlclose order opposite of dlopen order --- .../dlLibraryTable/dlLibraryTable.C | 62 ++++++++++++------- .../dlLibraryTable/dlLibraryTable.H | 10 +-- .../dlLibraryTable/dlLibraryTableTemplates.C | 4 +- 3 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C index 93d934a1b54..f04b9c1af61 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C +++ b/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; } diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H index f2925fe511e..9d92fea1537 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H +++ b/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&); diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C index 13a9ae919f1..46966e37d67 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C +++ b/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; -- GitLab