From 80a6c2995bef97c229d736a95e9cec245a29ad72 Mon Sep 17 00:00:00 2001 From: Jaeyun Date: Tue, 1 Nov 2022 11:25:54 +0900 Subject: [PATCH] [Queue] fix mem leak case Code clean, 1. fix mem leak case - max buffer in queue. 2. use common destroy callback. Signed-off-by: Jaeyun --- .../nnstreamer-edge-queue.c | 33 ++++++++----------- .../nnstreamer-edge-queue.h | 8 ++--- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/libnnstreamer-edge/nnstreamer-edge-queue.c b/src/libnnstreamer-edge/nnstreamer-edge-queue.c index d96f26e..4680888 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-queue.c +++ b/src/libnnstreamer-edge/nnstreamer-edge-queue.c @@ -25,7 +25,7 @@ typedef struct _nns_edge_queue_data_s nns_edge_queue_data_s; struct _nns_edge_queue_data_s { void *data; - nns_edge_queue_data_destroy_cb destroy; + nns_edge_data_destroy_cb destroy; nns_edge_queue_data_s *next; }; @@ -107,7 +107,6 @@ bool nns_edge_queue_destroy (nns_edge_queue_h handle) { nns_edge_queue_s *q = (nns_edge_queue_s *) handle; - nns_edge_queue_data_s *qdata; if (!q) { nns_edge_loge ("[Queue] Invalid param, queue is null."); @@ -116,16 +115,10 @@ nns_edge_queue_destroy (nns_edge_queue_h handle) nns_edge_lock (q); nns_edge_cond_signal (q); - while ((qdata = q->head) != NULL) { - if (qdata->destroy) - qdata->destroy (qdata->data); - q->head = qdata->next; - free (qdata); - } + while (q->length > 0U) + _pop_data (q, true); - q->head = q->tail = NULL; - q->length = 0U; nns_edge_unlock (q); nns_edge_cond_destroy (q); @@ -184,7 +177,7 @@ nns_edge_queue_set_limit (nns_edge_queue_h handle, unsigned int limit, */ bool nns_edge_queue_push (nns_edge_queue_h handle, void *data, - nns_edge_queue_data_destroy_cb destroy) + nns_edge_data_destroy_cb destroy) { nns_edge_queue_s *q = (nns_edge_queue_s *) handle; nns_edge_queue_data_s *qdata; @@ -200,15 +193,6 @@ nns_edge_queue_push (nns_edge_queue_h handle, void *data, return false; } - qdata = calloc (1, sizeof (nns_edge_queue_data_s)); - if (!qdata) { - nns_edge_loge ("[Queue] Failed to allocate new memory for data."); - return false; - } - - qdata->data = data; - qdata->destroy = destroy; - nns_edge_lock (q); if (q->max_data > 0U && q->length >= q->max_data) { /* Clear old data in queue if leaky option is 'old'. */ @@ -221,6 +205,15 @@ nns_edge_queue_push (nns_edge_queue_h handle, void *data, } } + qdata = calloc (1, sizeof (nns_edge_queue_data_s)); + if (!qdata) { + nns_edge_loge ("[Queue] Failed to allocate new memory for data."); + goto done; + } + + qdata->data = data; + qdata->destroy = destroy; + if (!q->head) q->head = qdata; if (q->tail) diff --git a/src/libnnstreamer-edge/nnstreamer-edge-queue.h b/src/libnnstreamer-edge/nnstreamer-edge-queue.h index 2a48064..176ccdf 100644 --- a/src/libnnstreamer-edge/nnstreamer-edge-queue.h +++ b/src/libnnstreamer-edge/nnstreamer-edge-queue.h @@ -16,6 +16,7 @@ #include #include +#include "nnstreamer-edge.h" #ifdef __cplusplus extern "C" { @@ -23,11 +24,6 @@ extern "C" { typedef void *nns_edge_queue_h; -/** - * @brief Callback called when data in queue is released. - */ -typedef void (*nns_edge_queue_data_destroy_cb) (void *data); - /** * @brief Enumeration for the queue leaky option. */ @@ -74,7 +70,7 @@ bool nns_edge_queue_set_limit (nns_edge_queue_h handle, unsigned int limit, nns_ * @param[in] destroy Nullable, the callback function to release data. * @return true on success. */ -bool nns_edge_queue_push (nns_edge_queue_h handle, void *data, nns_edge_queue_data_destroy_cb destroy); +bool nns_edge_queue_push (nns_edge_queue_h handle, void *data, nns_edge_data_destroy_cb destroy); /** * @brief Remove and return the first data in queue. -- 2.34.1