Allow wquque to use callback to free an mbuf - so
mbufs can be reused/pooled
This commit is contained in:
@@ -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,
|
typedef enum UC_WQ_RESULT (*wqueue_read_cb)(struct IOMux *mux,
|
||||||
struct UCWQueue *wqueue);
|
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.
|
* Represents a queue of data to write.
|
||||||
* UCWQueue replaces a raw IOMuxFD, and manages a queue
|
* UCWQueue replaces a raw IOMuxFD, and manages a queue
|
||||||
@@ -91,7 +97,8 @@ struct UCWQueue {
|
|||||||
/** Users callback for write events
|
/** Users callback for write events
|
||||||
*/
|
*/
|
||||||
wqueue_write_cb write_cb;
|
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
|
/** Current number of queued struct MBuf
|
||||||
*/
|
*/
|
||||||
unsigned int queue_len;
|
unsigned int queue_len;
|
||||||
|
|||||||
+3
-3
@@ -24,7 +24,7 @@ static int uc_wqueue_handle_write(struct UCWQueue *wqueue)
|
|||||||
|
|
||||||
mbuf = uc_mbuf_dequeue(&wqueue->queue);
|
mbuf = uc_mbuf_dequeue(&wqueue->queue);
|
||||||
assert(mbuf != NULL);
|
assert(mbuf != NULL);
|
||||||
uc_mbuf_free(mbuf);
|
wqueue->free_cb(mbuf);
|
||||||
wqueue->queue_len--;
|
wqueue->queue_len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ void uc_wqueue_init(struct UCWQueue *wqueue, struct IOMux *mux)
|
|||||||
memset(wqueue, 0, sizeof *wqueue);
|
memset(wqueue, 0, sizeof *wqueue);
|
||||||
wqueue->mux = mux;
|
wqueue->mux = mux;
|
||||||
wqueue->fd.callback = uc_wqueue_cb;
|
wqueue->fd.callback = uc_wqueue_cb;
|
||||||
|
wqueue->free_cb = uc_mbuf_free;
|
||||||
uc_tailq_init(&wqueue->queue);
|
uc_tailq_init(&wqueue->queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ int uc_wqueue_clear(struct UCWQueue *wqueue)
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
while ((buf = uc_mbuf_dequeue(&wqueue->queue)) != NULL) {
|
while ((buf = uc_mbuf_dequeue(&wqueue->queue)) != NULL) {
|
||||||
uc_mbuf_free(buf);
|
wqueue->free_cb(buf);
|
||||||
wqueue->queue_len--;
|
wqueue->queue_len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user