Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix memory leaks #163

Closed
richfitz opened this issue Apr 10, 2019 · 3 comments
Closed

Fix memory leaks #163

richfitz opened this issue Apr 10, 2019 · 3 comments

Comments

@richfitz
Copy link
Member

@richfitz richfitz commented Apr 10, 2019

valgrind is reporting leaks

@richfitz
Copy link
Member Author

@richfitz richfitz commented Apr 10, 2019

The code

  gen <- odin({
    initial(y[, ]) <- 1
    deriv(y[, ]) <- y[i, j] * r[i, j]
    dim(y) <- c(2, 3)
    dim(r) <- c(2, 3)
    r[, ] <- user()
  })

generates the code:

SEXP odin_create(SEXP user) {
  odin_internal *internal = (odin_internal*) Calloc(1, odin_internal);
  internal->initial_y = NULL;
  internal->r = NULL;
  internal->dim_r_1 = 2;
  internal->dim_r_2 = 3;
  internal->dim_y_1 = 2;
  internal->dim_y_2 = 3;
  internal->dim_r = internal->dim_r_1 * internal->dim_r_2;
  internal->dim_y = internal->dim_y_1 * internal->dim_y_2;
  Free(internal->initial_y);
  internal->initial_y = (double*) Calloc(internal->dim_y, double);
  Free(internal->r);
  internal->r = (double*) Calloc(internal->dim_r, double);
  for (int i = 1; i <= internal->dim_y_1; ++i) {
    for (int j = 1; j <= internal->dim_y_2; ++j) {
      internal->initial_y[i - 1 + internal->dim_y_1 * (j - 1)] = 1;
    }
  }
  internal->r = NULL;
  SEXP ptr = PROTECT(R_MakeExternalPtr(internal, R_NilValue, R_NilValue));
  R_RegisterCFinalizer(ptr, odin_finalise);
  UNPROTECT(1);
  return ptr;
}

We don't want to add the lines

  Free(internal->r);
  internal->r = (double*) Calloc(internal->dim_r, double);
richfitz added a commit that referenced this issue Apr 10, 2019
See #163 for a full listing of code
@richfitz
Copy link
Member Author

@richfitz richfitz commented Apr 10, 2019

This model

  gen <- odin({
    ylag <- delay(y, 3, 2)
    initial(y) <- 0.5
    deriv(y) <- 0.2 * ylag * 1 / (1 + ylag^10) - 0.1 * y
    output(ylag) <- ylag
    config(base) <- "delay3"
  })

generates a finalise/create pair that look like

void delay3_finalise(SEXP internal_p) {
  delay3_internal *internal = delay3_get_internal(internal_p, 0);
  if (internal_p) {
    Free(internal);
    R_ClearExternalPtr(internal_p);
  }
}
SEXP delay3_create(SEXP user) {
  delay3_internal *internal = (delay3_internal*) Calloc(1, delay3_internal);
  internal->delay_index_ylag = NULL;
  internal->delay_state_ylag = NULL;
  internal->dim_delay_ylag = 1;
  internal->initial_y = 0.5;
  Free(internal->delay_index_ylag);
  internal->delay_index_ylag = Calloc(internal->dim_delay_ylag, int);
  Free(internal->delay_state_ylag);
  internal->delay_state_ylag = Calloc(internal->dim_delay_ylag, double);
  internal->delay_index_ylag[0] = 0;
  SEXP ptr = PROTECT(R_MakeExternalPtr(internal, R_NilValue, R_NilValue));
  R_RegisterCFinalizer(ptr, delay3_finalise);
  UNPROTECT(1);
  return ptr;
}

with the Free statement missing for delay_index_ylag and delay_state_ylag

@richfitz
Copy link
Member Author

@richfitz richfitz commented Apr 10, 2019

The only one I see now is clearly from R itself:

==28409== 48 (40 direct, 8 indirect) bytes in 1 blocks are definitely lost in loss record 40 of 3,072
==28409==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==28409==    by 0x150FF921: value_alloc (yajl_tree.c:69)
==28409==    by 0x150FFBCC: handle_string (yajl_tree.c:282)
==28409==    by 0x150FF5C0: yajl_do_parse (yajl_parser.c:243)
==28409==    by 0x150FFFFE: yajl_tree_parse (yajl_tree.c:441)
==28409==    by 0x150FAA5D: R_parse (parse.c:34)
==28409==    by 0x4F61E50: ??? (in /usr/lib/R/lib/libR.so)
==28409==    by 0x4F6B7AF: Rf_eval (in /usr/lib/R/lib/libR.so)
==28409==    by 0x4F6D110: ??? (in /usr/lib/R/lib/libR.so)
==28409==    by 0x4F62E46: ??? (in /usr/lib/R/lib/libR.so)
==28409==    by 0x4F6B7AF: Rf_eval (in /usr/lib/R/lib/libR.so)
==28409==    by 0x4F6D110: ??? (in /usr/lib/R/lib/libR.so)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
2 participants
You can’t perform that action at this time.