From 43f3a3372ef4996fe6c9e32bbd2d17484c0a57e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Wed, 7 Dec 2016 20:58:39 +0100 Subject: [PATCH] Allow wquque to use callback to free an mbuf - so mbufs can be reused/pooled --- include/ucore/wqueue.h | 9 ++++++++- src/wqueue.c | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/ucore/wqueue.h b/include/ucore/wqueue.h index 636d873..4e64459 100644 --- a/include/ucore/wqueue.h +++ b/include/ucore/wqueue.h @@ -67,6 +67,12 @@ typedef enum UC_WQ_RESULT (*wqueue_write_cb)(struct IOMux *mux, typedef enum UC_WQ_RESULT (*wqueue_read_cb)(struct IOMux *mux, struct UCWQueue *wqueue); +/** + * Callback to free a MBuf once it's fully written. + * @param the fd of the current wqueue + */ +typedef void (*wqueue_free_mbuf_cb)(struct MBuf *mbuf); + /** * Represents a queue of data to write. * UCWQueue replaces a raw IOMuxFD, and manages a queue @@ -91,7 +97,8 @@ struct UCWQueue { /** Users callback for write events */ wqueue_write_cb write_cb; - + /** Function used to free an MBuf - default is uc_mbuf_free()*/ + wqueue_free_mbuf_cb free_cb; /** Current number of queued struct MBuf */ unsigned int queue_len; diff --git a/src/wqueue.c b/src/wqueue.c index 6ad49e6..47752ce 100644 --- a/src/wqueue.c +++ b/src/wqueue.c @@ -24,7 +24,7 @@ static int uc_wqueue_handle_write(struct UCWQueue *wqueue) mbuf = uc_mbuf_dequeue(&wqueue->queue); assert(mbuf != NULL); - uc_mbuf_free(mbuf); + wqueue->free_cb(mbuf); wqueue->queue_len--; } @@ -71,7 +71,7 @@ void uc_wqueue_init(struct UCWQueue *wqueue, struct IOMux *mux) memset(wqueue, 0, sizeof *wqueue); wqueue->mux = mux; wqueue->fd.callback = uc_wqueue_cb; - + wqueue->free_cb = uc_mbuf_free; uc_tailq_init(&wqueue->queue); } @@ -81,7 +81,7 @@ int uc_wqueue_clear(struct UCWQueue *wqueue) int rc = 0; while ((buf = uc_mbuf_dequeue(&wqueue->queue)) != NULL) { - uc_mbuf_free(buf); + wqueue->free_cb(buf); wqueue->queue_len--; }