* Bug 15321: lu() was leaking memory 17/21017/2
Stéphane MOTTELET [Fri, 21 Jun 2019 07:45:16 +0000 (09:45 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=15321

Change-Id: I9cd52ba473e71ff159bc9acffc1a561dd90db5e9

scilab/CHANGES.md
scilab/modules/linear_algebra/sci_gateway/cpp/sci_lu.cpp
scilab/modules/linear_algebra/src/c/lu.c
scilab/modules/linear_algebra/tests/nonreg_tests/bug_15321.tst [new file with mode: 0644]

index 30009e8..1814ebd 100644 (file)
@@ -150,6 +150,7 @@ Bug Fixes
 * [#15087](http://bugzilla.scilab.org/show_bug.cgi?id=15087): Deleting rows or columns from a matrix is slow (regression)
 * [#15269](http://bugzilla.scilab.org/show_bug.cgi?id=15269): `xgetech` was poor and stiff compared to any combination of `gca()` properties `.axes_bounds`, `.data_bounds`, `.log_flags`, and `.margins`. It is removed.
 * [#15271](http://bugzilla.scilab.org/show_bug.cgi?id=15271): `bitget` needed to be upgraded.
+* [#15321](http://bugzilla.scilab.org/show_bug.cgi?id=15321): `lu()` was leaking memory.
 * [#15425](http://bugzilla.scilab.org/show_bug.cgi?id=15425): The Kronecker product `a.*.b` failed when `a` or `b` or both are hypermatrices, with one or both being polynomials or rationals.
 * [#15523](http://bugzilla.scilab.org/show_bug.cgi?id=15523): `%ODEOPTIONS(1)=2` didn't work with solvers 'rk' and 'rkf' 
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
index 6eb5526..240e3d6 100644 (file)
@@ -65,6 +65,7 @@ types::Function::ReturnValue sci_lu(types::typed_list &in, int _iRetCount, types
         if (!pData)
         {
             Scierror(999, _("%s: Cannot allocate more memory.\n"), "lu");
+            pDbl->killMe();
             return types::Function::Error;
         }
     }
@@ -81,6 +82,7 @@ types::Function::ReturnValue sci_lu(types::typed_list &in, int _iRetCount, types
         {
             out.push_back(types::Double::Empty());
         }
+        pDbl->killMe();
         return types::Function::OK;
     }
 
@@ -97,6 +99,7 @@ types::Function::ReturnValue sci_lu(types::typed_list &in, int _iRetCount, types
             pDblE->set(0, 1);
             out.push_back(pDblE);
         }
+        pDbl->killMe();
         return types::Function::OK;
     }
 
@@ -125,6 +128,7 @@ types::Function::ReturnValue sci_lu(types::typed_list &in, int _iRetCount, types
     if (iRet != 0)
     {
         Scierror(999, _("%s: LAPACK error n°%d.\n"), "lu", iRet);
+        pDbl->killMe();
         FREE((doublecomplex*)pdL);
         FREE((doublecomplex*)pdU);
         delete pDblL;
@@ -146,6 +150,7 @@ types::Function::ReturnValue sci_lu(types::typed_list &in, int _iRetCount, types
         vFreeDoubleComplexFromPointer((doublecomplex*)pData);
     }
 
+    pDbl->killMe();
     out.push_back(pDblL);
     out.push_back(pDblU);
     if (_iRetCount == 3)
index d5434b3..706c5a4 100644 (file)
@@ -42,9 +42,10 @@ int iLuM(double* pData, int iRows, int iCols, int complexArg, double* pdblLData,
     ret = iLu(pData, iRows, iCols, complexArg, pdblLData, pdblUData, pdblEData, piPivot, piWork, pdblWork);
     if (pdblEData == NULL)
     {
-        FREE( piWork);
-        FREE( pdblWork );
+        FREE(piWork);
+        FREE(pdblWork);
     }
+    FREE(piPivot);
     return ret;
 }
 int iLu(double* pData, int iRows, int iCols, int complexArg, double* pdblLData, double* pdblUData, double* pdblEData
diff --git a/scilab/modules/linear_algebra/tests/nonreg_tests/bug_15321.tst b/scilab/modules/linear_algebra/tests/nonreg_tests/bug_15321.tst
new file mode 100644 (file)
index 0000000..0d79ef8
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Stéphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15321 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15321
+//
+// <-- Short Description -->
+// lu() is leaking memory
+
+m1 = getmemory();
+a = rand(100,100);
+for i=1:30000
+    [l,u] = lu(a);
+end
+clear i a l u
+m2 = getmemory();
+assert_checktrue((m1-m2)/m1 <= 0);
\ No newline at end of file