bug 14255 fix memory leak in fftw 71/17571/2
Calixte DENIZET [Fri, 11 Dec 2015 15:36:11 +0000 (16:36 +0100)]
Change-Id: Ie5b2f9fd405eb4f61c56d3a823cb47c17ba05982

scilab/CHANGES_6.0.X
scilab/modules/fftw/src/c/fftw_utilities.c
scilab/modules/fftw/tests/nonreg_tests/bug_14255.tst [new file with mode: 0644]

index d2b6707..dd7e0c3 100644 (file)
@@ -63,7 +63,7 @@ Bug Fixes
 
 * Bug #14253 fixed - Insertion in a struct contained in a list fixed.
 
-* Bug #14257 fixed - English spelling in messages and in comments.
+* Bug #14255 fixed - fftw without MKL leaked in internal withMKL function.
 
 * Bug #14300 fixed - Crash when playing with structures.
 
index 177a3db..2ac9d9a 100644 (file)
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  */
+#include <math.h>
+#include <malloc.h>
 #include "fftw_utilities.h"
 #include "sci_malloc.h"
 #include "callfftw.h"
-#include <math.h>
 int check_1D_symmetry(double *Ar, double *Ai, int nA, int iA);
 int check_2D_symmetry(double *Ar, double *Ai, int mA, int iA, int nA, int jA);
 int check_ND_symmetry(double *Ar, double *Ai, int ndims, int *dims, int *incr);
@@ -332,7 +333,7 @@ void ExecuteFFTWPlan(enum Plan_Type type, const fftw_plan p, double *ri, double
     switch (type)
     {
         case C2C_PLAN:
-            call_fftw_execute_split_dft(p, ri, ii, ro, io);
+                call_fftw_execute_split_dft(p, ri, ii, ro, io);
             break;
         case C2R_PLAN:
             call_fftw_execute_split_dft_c2r(p, ri, ii, ro);
@@ -1331,15 +1332,24 @@ int complete_array(double *Ar, double *Ai, guru_dim_struct gdim)
 
 int withMKL(void)
 {
-    char* str = call_fftw_export_wisdom_to_string();
-    int iWithMKL = (int)(str == NULL);
-    if (iWithMKL != 0)
+    static int iWithMKL = -1;
+
+    if (iWithMKL == -1)
     {
-        FREE(str);
+        char* str = NULL;
+        iWithMKL = 1;
+        str = call_fftw_export_wisdom_to_string();
+        if (str)
+        {
+            iWithMKL = 0;
+            // According to the FFTW documentation we should free str
+            // string but doing makes Scilab crash!?
+            //free(str);
+        }
     }
+
     return iWithMKL;
-}
-/*--------------------------------------------------------------------------*/
+}/*--------------------------------------------------------------------------*/
 
 
 
diff --git a/scilab/modules/fftw/tests/nonreg_tests/bug_14255.tst b/scilab/modules/fftw/tests/nonreg_tests/bug_14255.tst
new file mode 100644 (file)
index 0000000..ff398f3
--- /dev/null
@@ -0,0 +1,56 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- INTERACTIVE TEST -->
+//
+// <-- Non-regression test for bug 14255 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14255
+//
+// <-- Short Description -->
+// fftw without MKL leaks in withMKL function.
+
+
+//check memory usage before and after run test to check that Scilab does not used more. ( ~ 200/250 Mbytes )
+function y = myfun(x,WIZ) 
+    set_fftw_wisdom(WIZ);
+    y = fft(x,-1);
+    y = abs(y);
+endfunction
+
+ntrc = 10000;
+nsamp = 1024; 
+dum = fft([1:nsamp],-1);
+WIZ = get_fftw_wisdom();
+
+
+fd_1 = mopen('TMPDIR/junk.bin','wb');
+for ii =1:ntrc
+    x = rand(1,nsamp);
+    mput(x,'fb',fd_1);
+end
+mclose(fd_1);
+
+
+timer();
+fd_1 = mopen('TMPDIR/junk.bin','rb');
+fd_2 = mopen('TMPDIR/junkot.bin','wb');
+for ii =1:ntrc
+    x = mget(nsamp,'fb',fd_1);
+    y = myfun(x,WIZ);
+mput(y,'fb',fd_2); 
+end
+
+timer()
+mclose(fd_1);
+mclose(fd_2);
+
+deletefile('TMPDIR/junk.bin');
+deletefile('TMPDIR/junkot.bin');