X-Git-Url: http://git.squeep.com/?p=reservoir_sample;a=blobdiff_plain;f=reservoir.c;fp=reservoir.c;h=c139df4b447c60dc46a7c65b1bcc5770a8b8d012;hp=1878203037f0bc95ac16bd5b991b61fded1ec35a;hb=ee831dbcdf31c3d1205bc321a8bdbeeb151abe19;hpb=c8ff35a649a7df3d400221fc76131bff195a158b diff --git a/reservoir.c b/reservoir.c index 1878203..c139df4 100644 --- a/reservoir.c +++ b/reservoir.c @@ -12,10 +12,15 @@ #include "randomness.h" #include "test_suite.h" +/* If these ever need to be overridden.. */ +void *(*reservoir_malloc_)(size_t) = malloc; +void *(*reservoir_realloc_)(void *, size_t) = realloc; +void (*reservoir_free_)(void *) = free; + reservoir_t reservoir_new(size_t sz) { reservoir_t reservoir; - reservoir = malloc((sz * sizeof *reservoir->reservoir) + sizeof *reservoir); + reservoir = reservoir_malloc_((sz * sizeof *reservoir->reservoir) + sizeof *reservoir); if (reservoir == NULL) { NOTIFY_ERROR("%s:%s", "malloc", strerror(errno)); return NULL; @@ -28,11 +33,24 @@ reservoir_t reservoir_new(size_t sz) { return reservoir; } +void reservoir_del(reservoir_t *preservoir) { + if (preservoir) { + if (*preservoir) { + while ((*preservoir)->reservoir_used) { + (*preservoir)->reservoir_used -= 1; + buf_del(&((*preservoir)->reservoir[(*preservoir)->reservoir_used])); + } + reservoir_free_(*preservoir); + *preservoir = NULL; + } + } +} + int reservoir_grow(reservoir_t *preservoir, size_t growby) { assert(preservoir != NULL); if (growby) { - void *tmp_ptr = realloc(*preservoir, (((*preservoir)->reservoir_sz + growby) * sizeof *(*preservoir)->reservoir) + sizeof **preservoir); + void *tmp_ptr = reservoir_realloc_(*preservoir, (((*preservoir)->reservoir_sz + growby) * sizeof *(*preservoir)->reservoir) + sizeof **preservoir); if (tmp_ptr == NULL) { NOTIFY_ERROR("%s:%s", "realloc", strerror(errno)); return -1; @@ -84,7 +102,8 @@ void reservoir_remember(reservoir_t reservoir, buf_t buf) { if (old_buf != NULL) { D_BUF("FREEING ", old_buf); memset(old_buf, 0, old_buf->buf_sz + sizeof *old_buf); - free(old_buf); + buf_del(&old_buf); + assert(old_buf == NULL); } D_RESERVOIR(reservoir);