* Bug #8778 fixed - Call_ScilabOpen, TerminateScilab can not be called more 99/10899/4
Simon Marchetto [Thu, 18 Apr 2013 11:28:34 +0000 (13:28 +0200)]
                    than 80 times in a loop.

Fix: free stack (and global stack) in TerminateScilab

+ refactoring: freemem, freegmem renamed to freeStackLastMemory, freeGlobalStackLastMemory respectively

Change-Id: Idc282a2460c2b83f954d94634ac6ce002a7b0bae

scilab/CHANGES_5.5.X
scilab/modules/core/includes/scimem.h
scilab/modules/core/src/c/TerminateCore.c
scilab/modules/core/src/c/scimem.c
scilab/modules/core/src/fortran/core_Import.def
scilab/modules/core/src/fortran/stack.f
scilab/modules/core/src/fortran/storeglobal.f

index 5f4ec8b..7d803bf 100644 (file)
@@ -178,6 +178,9 @@ Bug fixes
 
 * Bug #8687 fixed - typeof() function failed on uint8, depending on the format (+ unit test added).
 
+* Bug #8778 fixed - Call_ScilabOpen, TerminateScilab can not be called more
+                    than 80 times in a loop.
+
 * Bug #8824 fixed - taucs_chfact returned a segfault (not the case in mode nwni).
 
 * Bug #8856 fixed - Non regression test added for [k,l,m,...]=find(a==5).
index 2801d2c..39ecb0d 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2006 - INRIA - Sylvestre LEDRU
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  */
 int C2F(scimem) (int *newsize, int *ptr);
 int C2F(scigmem) (int *newsize, int *ptr);
 
-void C2F(freegmem) (void);
-void C2F(freemem) (void);
+void C2F(freestacklastmemory)();
+void C2F(freeglobalstacklastmemory)();
+
+void freeStackCurrentMemory();
+void freeGlobalStackCurrentMemory();
 #endif /* __SCIMEM_H_ */
 /*--------------------------------------------------------------------------*/
index 8701976..f10e358 100644 (file)
@@ -32,27 +32,30 @@ BOOL TerminateCorePart1(void)
         char *quit_script = NULL;
 
         /* bug 3672 */
-        if (getScilabMode() == SCILAB_STD) quit_script = get_sci_data_strings(QUIT_ERRCATCH_ID);
-        else quit_script = get_sci_data_strings(QUIT_ID);
+        if (getScilabMode() == SCILAB_STD)
+        {
+            quit_script = get_sci_data_strings(QUIT_ERRCATCH_ID);
+        }
+        else
+        {
+            quit_script = get_sci_data_strings(QUIT_ID);
+        }
 
         /* launch scilab.quit script */
-        C2F(scirun)(quit_script,(long int)strlen(quit_script));
+        C2F(scirun)(quit_script, (long int)strlen(quit_script));
     }
     return TRUE;
 }
 /*--------------------------------------------------------------------------*/
 BOOL TerminateCorePart2(void)
 {
-       /* memory freed by OS for all platforms and all targets */
-       /* freemem can crash randomly at exit with VS 2010 (32 bits) */
-       /* same behavior on all platforms */
+    // Free stack and global stack
+    C2F(freestacklastmemory)();
+    C2F(freeglobalstacklastmemory)();
+
+    freeStackCurrentMemory();
+    freeGlobalStackCurrentMemory();
 
-//#ifdef _MSC_VER /* Bug under Linux on freeing memory */
-//#ifndef _WIN64
-//    C2F(freegmem)();
-//    C2F(freemem)();
-//#endif
-//#endif
 
     DisposeModulesInfo();
 
index 5320207..456cc5d 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  */
@@ -100,25 +100,52 @@ int C2F(scigmem) (int *n, int *ptr)
 }
 
 /*--------------------------------------------------------------------------*/
-void C2F(freegmem) (void)
+void C2F(freeglobalstacklastmemory) (void)
 {
-#ifdef USE_DYNAMIC_STACK
-    freemem64(TRUE);
-#else
+#ifndef USE_DYNAMIC_STACK
     if (the_gps != NULL)
+    {
         SCISTACKFREE(the_gps);
+    }
+    the_gps = NULL;
 #endif
 }
 
 /*--------------------------------------------------------------------------*/
-void C2F(freemem) (void)
+void C2F(freestacklastmemory) (void)
 {
-#ifdef USE_DYNAMIC_STACK
-    freemem64(FALSE);
-#else
+#ifndef USE_DYNAMIC_STACK
     if (the_ps != NULL)
+    {
         SCISTACKFREE(the_ps);
+    }
+    the_ps = NULL;
 #endif
 }
 
 /*--------------------------------------------------------------------------*/
+void freeGlobalStackCurrentMemory()
+{
+#ifdef USE_DYNAMIC_STACK
+    freemem64(TRUE);
+#else
+    if (the_gp != NULL)
+    {
+        SCISTACKFREE(the_gp);
+    }
+    the_gp = NULL;
+#endif
+}
+
+void freeStackCurrentMemory()
+{
+#ifdef USE_DYNAMIC_STACK
+    freemem64(FALSE);
+#else
+    if (the_p != NULL)
+    {
+        SCISTACKFREE(the_p);
+    }
+    the_p = NULL;
+#endif
+}
index 71eed37..5e5c993 100644 (file)
@@ -2,9 +2,9 @@ LIBRARY    core.dll
 
 
 EXPORTS
-; --------------------------------------- 
+; ---------------------------------------
 ; core
-; --------------------------------------- 
+; ---------------------------------------
 recu_
 iop_
 stack_
@@ -73,5 +73,7 @@ pmatj_
 getpoly_
 getmat_
 inffic_
-freegmem_
-freemem_
+freestacklastmemory_
+freeglobalstacklastmemory_
+freeStackCurrentMemory
+freeGlobalStackCurrentmemory
index ab9eae4..ad53f0b 100644 (file)
@@ -1,10 +1,10 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) 2006 - INRIA - Allan CORNET
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
       subroutine adjuststacksize(mem,offset)
@@ -13,15 +13,15 @@ c     routine for intstacksize
       INCLUDE 'stack.h'
       integer offset,p
       integer iadr,sadr
-         
+
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
-      
+
       lbot=lstk(isiz)-lstk(bot)
       ltop=lstk(top+1)-lstk(1)
-      
+
       offset=offset+1
-      
+
       l1=lstk(1)
       l2=lstk(bot)
 c     copy the top of the stack
@@ -38,7 +38,7 @@ c     copy the bottom of the stack
          lstk(k)=lstk(k)+kd2
  40   continue
 
-      call freemem()
+      call freeStackLastMemory()
 c     update reference variables
       do 41 i=1,top
          if(infstk(i).ne.2) then
@@ -90,16 +90,16 @@ c ====================================================================
       logical eqid
 c
       iadr(l)=l+l-1
-      
+
       offset=offset+1
       call unsfdcopy(l,stk(lstk(isiz+2)),1,stk(offset),1)
       kd=offset-lstk(isiz+2)
       do 05 k=isiz+2,gtop+1
          lstk(k)=lstk(k)+kd
- 05   continue 
-      call freegmem()
+ 05   continue
+      call freeGlobalStackLastMemory()
       lstk(gbot)=lstk(isiz+2)+mem
-c     following lines are necessary because of use of il=iadr(istk(il+1)) 
+c     following lines are necessary because of use of il=iadr(istk(il+1))
 c     to get variable pointed by an indirect variable.
 c     it should be no more useful with il=iadr(lstk(istk(il+2)))
       do 09 i = isiz+2, gtop
index ab1f9aa..0cf63ca 100644 (file)
@@ -1,10 +1,10 @@
 c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 c Copyright (C) INRIA
-c 
+c
 c This file must be used under the terms of the CeCILL.
 c This source file is licensed as described in the file COPYING, which
 c you should have received as part of this distribution.  The terms
-c are also available at    
+c are also available at
 c http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
       subroutine storeglobal(id,k)
@@ -16,9 +16,9 @@ c
       logical eqid
       integer v,vk
 c
-      iadr(l)=l+l-1   
+      iadr(l)=l+l-1
+
 
-   
       il=iadr(lstk(k))
       kg=istk(il+2)
       if (.not.eqid(idstk(1,kg),id)) then
@@ -62,7 +62,7 @@ c     .           not enough memory, realloc
                endif
                call unsfdcopy(lstk(gtop+1)-lstk(kg+1),stk(ls),-1,
      $              stk(ll),-1)
-c     .        update pointer               
+c     .        update pointer
             else
 c     .        new is smaller, move bottom up
                call unsfdcopy(lstk(gtop+1)-lstk(kg+1),stk(ls),1,
@@ -88,7 +88,7 @@ c     .  update pointers on variables
         if(update) then
 
 
-c     .     following lines are necessary because of use of 
+c     .     following lines are necessary because of use of
 c     .     il=iadr(istk(il+1)) to get variable pointed by an indirect
 c     .     variable.
 c     .     it should be no more useful with il=iadr(lstk(istk(il+2)))
@@ -140,10 +140,10 @@ c
       kd=offset-lstk(isiz+2)
       do 05 k=isiz+2,gtop+1
          lstk(k)=lstk(k)+kd
- 05   continue 
-      call freegmem()
+ 05   continue
+      call freeGlobalStackLastMemory()
       lstk(gbot)=lstk(isiz+2)+mem
-c     following lines are necessary because of use of il=iadr(istk(il+1)) 
+c     following lines are necessary because of use of il=iadr(istk(il+1))
 c     to get variable pointed by an indirect variable.
 c     it should be no more useful with il=iadr(lstk(istk(il+2)))
       do 09 i = isiz+2, gtop