change order of tasks during scilab stop 12/17712/4
Antoine ELIAS [Fri, 22 Jan 2016 15:29:59 +0000 (16:29 +0100)]
 -> exec scilab.quit.
 -> exec modules.quit.
 -> close scopes (macros and gateways).
 -> unload dynamic libraries.

Change-Id: I1f9946b70e81ada38741606d8fccd6cb7b1f6438

scilab/CHANGES_6.0.X
scilab/modules/core/src/cpp/InitScilab.cpp
scilab/modules/dynamic_link/etc/dynamic_link.quit

index dd7e0c3..b1aa32b 100644 (file)
@@ -133,6 +133,8 @@ Bug Fixes
 
 * Bug #12044 fixed - Adding or substracting the empty matrix now return an empty matrix.
 
+* Bug #12419 fixed - objects were cleared before the scilab.quit was called
+
 * Bug #12928 fixed - int functions with %nan and %inf return wrong values.
 
 * Bug #13709 fixed - unique function sometimes returned wrong index values.
index 92698d6..9a3eb0c 100644 (file)
@@ -84,6 +84,7 @@ extern "C"
 #endif
 
 #include "InitializeTclTk.h"
+#include "dynamic_link.h"
 
     /* Defined without include to avoid useless header dependency */
     extern BOOL isItTheDisabledLib(void);
@@ -391,14 +392,6 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
 
     clearScilabPreferences();
 
-    //close console scope
-    //symbol::Context::getInstance()->scope_end();
-
-    // close macros scope before close dynamic library.
-    // all pointers allocated by a dynamic library have to be free before dlclose.
-    symbol::Context::getInstance()->scope_end();
-
-    //execute scilab.quit
     if (_pSEI->pstFile)
     {
         //-f option execute exec('%s',-1)
@@ -411,11 +404,15 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
     }
     else if (_pSEI->iNoStart == 0)
     {
+        //execute scilab.quit
         execScilabQuitTask(_pSEI->iSerialize != 0);
         //call all modules.quit
         EndModules();
     }
 
+    // close macros scope
+    symbol::Context::getInstance()->scope_end();
+
     //close gateways scope
     symbol::Context::getInstance()->scope_end();
 
@@ -423,11 +420,26 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
     symbol::Context::getInstance()->clearAll();
     //destroy context
     symbol::Context::destroyInstance();
+
 #ifndef NDEBUG
     //uncomment to print mem leak log
     //types::Inspector::displayMemleak();
 #endif
 
+    //close dynamic linked libraries
+    std::vector<ConfigVariable::DynamicLibraryStr*>* pDLLIst = ConfigVariable::getDynamicLibraryList();
+    int size = pDLLIst->size();
+    for (int i = 0; i < size; i++)
+    {
+        ConfigVariable::DynamicLibraryStr* pStr = ConfigVariable::getDynamicLibrary(i);
+        if (pStr)
+        {
+            DynLibHandle iLib = pStr->hLib;
+            ConfigVariable::removeDynamicLibrary(i);
+            Sci_dlclose(iLib);
+        }
+    }
+
     // cleanup Java dependent features
     saveCWDInPreferences();
     clearScilabPreferences();
index 3486961..e2e9bd9 100644 (file)
@@ -9,5 +9,5 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 // =============================================================================
 // free all dynamics libraries
-ulink();
+//ulink();
 // =============================================================================