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