From 598b72be37afa160bf584942be0b6d278475b6ba Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 20 Aug 2018 16:41:43 +0200 Subject: [PATCH] prevent a huge memory leak by calling fftw3 in a loop --- src/frontend/com_fft.c | 51 ++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/frontend/com_fft.c b/src/frontend/com_fft.c index a1d86f7b0..e9bd460a1 100644 --- a/src/frontend/com_fft.c +++ b/src/frontend/com_fft.c @@ -160,15 +160,21 @@ com_fft(wordlist *wl) printf("FFT: Time span: %g s, input length: %d\n", span, length); printf("FFT: Frequency resolution: %g Hz, output length: %d\n", 1.0/span, fpts); - for (i = 0; i 0) { + for (j = 0; j < length; j++) + in[j] = tdvec[i][j]*win[j]; + } fftw_execute(plan_forward); @@ -178,8 +184,12 @@ com_fft(wordlist *wl) fdvec[i][j].cx_imag = out[j][1]/scale; } - fftw_free(in); - fftw_free(out); + } + + fftw_destroy_plan(plan_forward); + + fftw_free(in); + fftw_free(out); #else /* Green's FFT */ @@ -213,14 +223,11 @@ com_fft(wordlist *wl) tfree(in); -#endif - } -done: -#ifdef HAVE_LIBFFTW3 - fftw_destroy_plan(plan_forward); #endif + +done: tfree(tdvec); tfree(fdvec); tfree(win); @@ -385,12 +392,18 @@ com_psd(wordlist *wl) in = fftw_malloc(sizeof(double) * (unsigned int) length); out = fftw_malloc(sizeof(fftw_complex) * (unsigned int) fpts); - for (i = 0; i 0) { + for (j = 0; j < length; j++) + in[j] = tdvec[i][j]*win[j]; + } fftw_execute(plan_forward); @@ -479,12 +492,12 @@ com_psd(wordlist *wl) fdvec[i][j].cx_real = reald[j] * (double)fpts / freq[fpts - 1]; } -done: #ifdef HAVE_LIBFFTW3 + fftw_destroy_plan(plan_forward); fftw_free(in); fftw_free(out); - fftw_destroy_plan(plan_forward); #endif +done: tfree(tdvec); tfree(fdvec); tfree(win);