From 288bfbe935fa8dd6a04462fe2436851d1071e199 Mon Sep 17 00:00:00 2001 From: Christoph Sprunk <sprunkc@informatik.uni-freiburg.de> Date: Mon, 15 Jul 2013 11:17:54 +0200 Subject: [PATCH] Changing egsl_alloc_in_context to work like egsl_alloc to avoid memory leaks. One could merge these two methods since they do the same only on a different context index... --- sm/lib/egsl/egsl.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/sm/lib/egsl/egsl.c b/sm/lib/egsl/egsl.c index bfecfdc..5a57f13 100644 --- a/sm/lib/egsl/egsl.c +++ b/sm/lib/egsl/egsl.c @@ -190,12 +190,33 @@ val egsl_alloc(size_t rows, size_t columns) { } val egsl_alloc_in_context(int context, size_t rows, size_t columns) { - egsl_total_allocations++; - struct egsl_context *c = egsl_contexts+context; + struct egsl_context*c = egsl_contexts+context; + + if(c->nvars>=MAX_VALS) { + fprintf(stderr,"Limit reached, in context %d, nvars is %d\n",context,c->nvars); + egsl_error(); + } int index = c->nvars; - c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); - c->nvars++; - return assemble_val(context,index,c->vars[index].gsl_m); + if(index<c->nallocated) { + gsl_matrix*m = c->vars[index].gsl_m; + if(m->size1 == rows && m->size2 == columns) { + egsl_cache_hits++; + c->nvars++; + return assemble_val(context,index,c->vars[index].gsl_m); + } else { + gsl_matrix_free(m); + egsl_total_allocations++; + c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); + c->nvars++; + return assemble_val(context,index,c->vars[index].gsl_m); + } + } else { + egsl_total_allocations++; + c->vars[index].gsl_m = gsl_matrix_alloc((size_t)rows,(size_t)columns); + c->nvars++; + c->nallocated++; + return assemble_val(context,index,c->vars[index].gsl_m); + } } /** Creates a copy of v in the previous context. */ -- GitLab