From 94dcd522aad89abec12ca473a43964fe5783ab39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Fri, 4 Dec 2015 22:25:57 +0100 Subject: [PATCH] Pass the wqueue directly to the wqueue callback functions --- include/ucore/wqueue.h | 9 +++++++-- src/wqueue.c | 4 ++-- test/console_print.c | 10 +++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/ucore/wqueue.h b/include/ucore/wqueue.h index d34a7bc..636d873 100644 --- a/include/ucore/wqueue.h +++ b/include/ucore/wqueue.h @@ -24,6 +24,8 @@ enum UC_WQ_RESULT { UC_WQ_ABORT = -1 }; +struct UCWQueue; + /** * Callback that will be called when data can be written to the fd. * The return value from this function must be strictly followed. @@ -49,7 +51,9 @@ enum UC_WQ_RESULT { * for this event. * */ -typedef enum UC_WQ_RESULT (*wqueue_write_cb)(struct IOMux *mux, struct IOMuxFD *fd, struct MBuf *mbuf); +typedef enum UC_WQ_RESULT (*wqueue_write_cb)(struct IOMux *mux, + struct UCWQueue *wqueue, + struct MBuf *mbuf); /** * Callback when read events are indicated. @@ -60,7 +64,8 @@ typedef enum UC_WQ_RESULT (*wqueue_write_cb)(struct IOMux *mux, struct IOMuxFD * * @param mux associated IOMux * @param the fd of the current wqueue */ -typedef enum UC_WQ_RESULT (*wqueue_read_cb)(struct IOMux *mux, struct IOMuxFD *fd); +typedef enum UC_WQ_RESULT (*wqueue_read_cb)(struct IOMux *mux, + struct UCWQueue *wqueue); /** * Represents a queue of data to write. diff --git a/src/wqueue.c b/src/wqueue.c index 5526d78..6ad49e6 100644 --- a/src/wqueue.c +++ b/src/wqueue.c @@ -15,7 +15,7 @@ static int uc_wqueue_handle_write(struct UCWQueue *wqueue) q = UC_TAILQ_FIRST(&wqueue->queue); mbuf = UC_TAILQ_CONTAINER(q, struct MBuf, entry); - rc = wqueue->write_cb(mux, fd, mbuf); + rc = wqueue->write_cb(mux, wqueue, mbuf); if (rc <= 0) { //NOTE for rc < 0, nothing can touch the wqueue or fd //any more, as it might been free'd @@ -58,7 +58,7 @@ static void uc_wqueue_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int wha if (rc >= 0 && what & MUX_EV_READ) { - rc = wqueue->read_cb(mux, fd); + rc = wqueue->read_cb(mux, wqueue); //NOTE - can't touch the wqueue or fd after this point, //as it might been free'd } diff --git a/test/console_print.c b/test/console_print.c index a22d562..3e15e99 100644 --- a/test/console_print.c +++ b/test/console_print.c @@ -9,7 +9,7 @@ #include -int stdout_read(struct IOMux *mux, struct IOMuxFD *fd) +int stdout_read(struct IOMux *mux, struct UCWQueue *wqueue) { return 1; } @@ -24,9 +24,9 @@ void stdin_read_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event) printf("Read %d bytes\n", len); if (len <= 0) { uc_mbuf_free(mbuf); - iomux_unregister_fd(mux, fd); - uc_wqueue_clear(wqueue); iomux_unregister_fd(mux, &wqueue->fd); + uc_wqueue_clear(wqueue); + iomux_unregister_fd(mux, fd); return; } @@ -44,7 +44,7 @@ struct IOMuxFD stdin_fd = { }; -int stdout_write(struct IOMux *mux, struct IOMuxFD *fd, struct MBuf *mbuf) +int stdout_write(struct IOMux *mux, struct UCWQueue *wqueue, struct MBuf *mbuf) { uint32_t len; ssize_t wlen; @@ -52,7 +52,7 @@ int stdout_write(struct IOMux *mux, struct IOMuxFD *fd, struct MBuf *mbuf) len = uc_mbuf_len(mbuf); data = uc_mbuf_pull(mbuf, len); - wlen = write(fd->fd, data, len); + wlen = write(wqueue->fd.fd, data, len); if (wlen < 0) { if (errno != EWOULDBLOCK) {