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