diff --git a/libretro-common/include/queues/fifo_queue.h b/libretro-common/include/queues/fifo_queue.h index 16bc43bbc6..8257dc45ff 100644 --- a/libretro-common/include/queues/fifo_queue.h +++ b/libretro-common/include/queues/fifo_queue.h @@ -29,6 +29,7 @@ #include #include +#include RETRO_BEGIN_DECLS @@ -54,14 +55,7 @@ void fifo_write(fifo_buffer_t *buffer, const void *in_buf, size_t size); void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t size); -static INLINE void fifo_free(fifo_buffer_t *buffer) -{ - if (!buffer) - return; - - free(buffer->buffer); - free(buffer); -} +void fifo_free(fifo_buffer_t *buffer); #define FIFO_READ_AVAIL(buffer) (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first) diff --git a/libretro-common/queues/fifo_queue.c b/libretro-common/queues/fifo_queue.c index 8fddb310ca..7e3849f4ce 100644 --- a/libretro-common/queues/fifo_queue.c +++ b/libretro-common/queues/fifo_queue.c @@ -23,29 +23,71 @@ #include #include +#include +#include +#include + #include +static bool fifo_initialize_internal(fifo_buffer_t *buf, size_t size) +{ + uint8_t *buffer = (uint8_t*)calloc(1, size + 1); + + if (!buffer) + return false; + + buf->buffer = buffer; + buf->size = size + 1; + buf->first = 0; + buf->end = 0; + + return true; +} + +bool fifo_initialize(fifo_buffer_t *buf, size_t size) +{ + if (!buf) + return false; + return fifo_initialize_internal(buf, size); +} + +void fifo_free(fifo_buffer_t *buffer) +{ + if (!buffer) + return; + + free(buffer->buffer); + free(buffer); +} + +bool fifo_deinitialize(fifo_buffer_t *buffer) +{ + if (!buffer) + return false; + + if (buffer->buffer) + free(buffer->buffer); + buffer->buffer = NULL; + buffer->size = 0; + buffer->first = 0; + buffer->end = 0; + + return true; +} + fifo_buffer_t *fifo_new(size_t size) { - uint8_t *buffer = NULL; fifo_buffer_t *buf = (fifo_buffer_t*)malloc(sizeof(*buf)); if (!buf) return NULL; - buf->first = 0; - buf->end = 0; - buffer = (uint8_t*)calloc(1, size + 1); - - if (!buffer) + if (!fifo_initialize_internal(buf, size)) { free(buf); return NULL; } - buf->buffer = buffer; - buf->size = size + 1; - return buf; }