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--; }