From f5df85596a66ff4eebf6d77d4ee1f215d391d5a1 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sat, 19 Jul 2014 00:29:52 -0400 Subject: [PATCH] Convert circular buffer over to reference counting --- source/buffer/buf.c | 26 ++++++++++++-------------- source/buffer/buf.h | 11 +---------- source/vector/vec.c | 1 - 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/source/buffer/buf.c b/source/buffer/buf.c index 76b64ec..d93f0aa 100644 --- a/source/buffer/buf.c +++ b/source/buffer/buf.c @@ -6,13 +6,16 @@ */ #include #include "buf.h" +#include "mem.h" + +static void buf_free(void* p_buf); buf_t* buf_new(size_t size) { buf_t* buf = NULL; if (size > 0) { - buf = (buf_t*) malloc( sizeof(buf_t) ); + buf = (buf_t*) mem_allocate(sizeof(buf_t), &buf_free); buf->buffer = (void**) malloc( sizeof(void*) * size ); buf->size = size; buf->reads = 0; @@ -21,13 +24,6 @@ buf_t* buf_new(size_t size) return buf; } -void buf_free(buf_t* buf, bool free_contents) -{ - buf_clear(buf,free_contents); - free( buf->buffer ); - free( buf ); -} - size_t buf_size(buf_t* buf) { return (size_t)buf->size; @@ -45,14 +41,11 @@ bool buf_full(buf_t* buf) return full; } -void buf_clear(buf_t* buf, bool free_contents) +void buf_clear(buf_t* buf) { - if (free_contents) + while ( !buf_empty(buf) ) { - while ( !buf_empty(buf) ) - { - free( buf_read(buf) ); - } + mem_release( buf_read(buf) ); } buf->reads = 0; buf->writes = 0; @@ -81,3 +74,8 @@ bool buf_write(buf_t* buf, void* data) return success; } +static void buf_free(void* p_buf) +{ + buf_clear((buf_t*)p_buf); + free( ((buf_t*)p_buf)->buffer ); +} diff --git a/source/buffer/buf.h b/source/buffer/buf.h index 773d34b..14bf04f 100644 --- a/source/buffer/buf.h +++ b/source/buffer/buf.h @@ -30,14 +30,6 @@ typedef struct { */ buf_t* buf_new(size_t size); -/** - * @brief Frees the provided buffer and optionally any unread contents. - * - * @param buf The buffer to free. - * @param free_contents Whether unread contents should also be freed. - */ -void buf_free(buf_t* buf, bool free_contents); - /** * @brief Returns the size of the provided buffer. * @@ -69,9 +61,8 @@ bool buf_full(buf_t* buf); * @brief Clears all unread data from the provided buffer. * * @param buf The buffer to clear. - * @param free_contents Whether the unread contents should also be freed. */ -void buf_clear(buf_t* buf, bool free_contents); +void buf_clear(buf_t* buf); /** * @brief Reads an item from the provided buffer. diff --git a/source/vector/vec.c b/source/vector/vec.c index 60dca5f..e645e9e 100644 --- a/source/vector/vec.c +++ b/source/vector/vec.c @@ -191,7 +191,6 @@ void vec_clear(vec_t* p_vec) p_vec->size = 0; } - static void vec_free(void* p_vec) { vec_clear((vec_t*)p_vec); -- 2.55.0