From 17f6e571e70d086ad4fbbb91818483e112deef01 Mon Sep 17 00:00:00 2001 From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be> Date: Thu, 21 Oct 2010 08:45:31 +0000 Subject: [PATCH] Solver : linearSystemCSR : reduced peak memory (and remove potential memory leak) --- Solver/linearSystemCSR.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Solver/linearSystemCSR.cpp b/Solver/linearSystemCSR.cpp index 20ab399b1e..8a06325f7d 100644 --- a/Solver/linearSystemCSR.cpp +++ b/Solver/linearSystemCSR.cpp @@ -24,9 +24,7 @@ static void *CSRMalloc(size_t size) static void *CSRRealloc(void *ptr, size_t size) { - if (!size) return(NULL); - ptr = realloc(ptr, size); - return(ptr); + return realloc(ptr, size); } static void CSRList_Realloc(CSRList_T *liste, int n) @@ -46,10 +44,11 @@ static void CSRList_Realloc(CSRList_T *liste, int n) } } -static void CSRList_Resize(CSRList_T *liste, int n) +static void CSRList_Resize_strict(CSRList_T *liste, int n) { - CSRList_Realloc(liste, n); + liste->array = (char *)CSRRealloc(liste->array, n * liste->size); liste->n = n; + liste->nmax = n; } static CSRList_T *CSRList_Create(int n, int incr, int size) @@ -105,13 +104,11 @@ void linearSystemCSR<double>::preAllocateEntries () _sparsity.getRow (i, nInRow); nnz += nInRow; } - CSRList_Resize (_a, nnz); - CSRList_Resize (_ai, nnz); - CSRList_Resize (_ptr, nnz); + CSRList_Resize_strict (_ai, nnz); + CSRList_Resize_strict (_ptr, nnz); INDEX_TYPE *jptr = (INDEX_TYPE*) _jptr->array; INDEX_TYPE *ai = (INDEX_TYPE*) _ai->array; INDEX_TYPE *ptr = (INDEX_TYPE*) _ptr->array; - double *a = ( double * ) _a->array; jptr[0] = 0; nnz = 0; for (int i = 0; i < nbRows; i++){ @@ -119,18 +116,23 @@ void linearSystemCSR<double>::preAllocateEntries () const int *row = _sparsity.getRow (i, nInRow); for (int j = 0; j < nInRow; j++) { ai[nnz] = row[j]; - a[nnz] = 0.; ptr[nnz] = nnz+1; nnz ++; } if (nInRow != 0) - ptr[nnz-1] = 0; - jptr[i+1] = nnz; + ptr[nnz - 1] = 0; + jptr[i + 1] = nnz; something[i] = (nInRow == 0 ? 0 : 1); } _entriesPreAllocated = true; sorted = true; _sparsity.clear(); + // we do this after _sparsity.clear so that the peak memory usage is reduced + CSRList_Resize_strict (_a, nnz); + double *a = ( double * ) _a->array; + for (int i = 0; i < nnz; i++) { + a[i] = 0.; + } } template<> -- GitLab