Merge branch 'release/1.3'
[reservoir_sample] / reservoir.c
index 1878203037f0bc95ac16bd5b991b61fded1ec35a..c139df4b447c60dc46a7c65b1bcc5770a8b8d012 100644 (file)
 #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);