Skip to content
Snippets Groups Projects
Commit 46dafc31 authored by Andrea Censi's avatar Andrea Censi
Browse files

Merge pull request #2 from csprunk/master

A few fixes for memory leaks found by Christoph Sprunk from U Freiburg.
parents 39aefd0d ea476a46
No related branches found
No related tags found
No related merge requests found
......@@ -175,10 +175,11 @@ void sm_icp(struct sm_params*params, struct sm_result*res) {
res->iterations = iterations;
res->nvalid = nvalid;
gsl_vector_free(x_new);
gsl_vector_free(x_old);
gsl_vector_free(best_x);
}
gsl_vector_free(x_new);
gsl_vector_free(x_old);
egsl_pop_named("sm_icp");
......
......@@ -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. */
......@@ -278,5 +299,13 @@ double egsl_atm(val v1, size_t i, size_t j){
return *egsl_atmp(v1, i, j);
}
void egsl_free(void){
int c;
for(c=0;c<=max_cid;c++) {
for(int i=egsl_contexts[c].nvars; i<egsl_contexts[c].nallocated; i++){
gsl_matrix_free(egsl_contexts[c].vars[i].gsl_m);
}
egsl_contexts[c].nallocated = egsl_contexts[c].nvars;
}
}
......@@ -60,5 +60,5 @@ gsl_matrix* egsl_v2gslm(val v){
gsl_matrix * m = egsl_gslm(v);
gsl_matrix * m2 = gsl_matrix_alloc(m->size1,m->size2);
gsl_matrix_memcpy(m2,m);
return m;
return m2;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment