X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=ubusd_main.c;h=3728a4279238f1c8dba36491b37c8b9bd0f44488;hb=4becbd67de5867ec32a53cb15566a6ef505f4619;hp=c3d8049558641b0f140d0b507608baebb89f160d;hpb=2537be01858710e714c329153760c64fe3f8a73e;p=project%2Fubus.git diff --git a/ubusd_main.c b/ubusd_main.c index c3d8049..3728a42 100644 --- a/ubusd_main.c +++ b/ubusd_main.c @@ -17,28 +17,11 @@ #include "ubusd.h" -static struct ubus_msg_buf *ubus_msg_head(struct ubus_client *cl) -{ - return cl->tx_queue[cl->txq_cur]; -} - -static void ubus_msg_dequeue(struct ubus_client *cl) -{ - struct ubus_msg_buf *ub = ubus_msg_head(cl); - - if (!ub) - return; - - ubus_msg_free(ub); - cl->txq_ofs = 0; - cl->tx_queue[cl->txq_cur] = NULL; - cl->txq_cur = (cl->txq_cur + 1) % ARRAY_SIZE(cl->tx_queue); -} - static void handle_client_disconnect(struct ubus_client *cl) { - while (ubus_msg_head(cl)) - ubus_msg_dequeue(cl); + struct ubus_msg_buf_list *ubl, *ubl2; + list_for_each_entry_safe(ubl, ubl2, &cl->tx_queue, list) + ubus_msg_list_free(ubl); ubusd_monitor_disconnect(cl); ubusd_proto_free_client(cl); @@ -55,6 +38,7 @@ static void client_cb(struct uloop_fd *sock, unsigned int events) uint8_t fd_buf[CMSG_SPACE(sizeof(int))] = { 0 }; struct msghdr msghdr = { 0 }; struct ubus_msg_buf *ub; + struct ubus_msg_buf_list *ubl, *ubl2; static struct iovec iov; struct cmsghdr *cmsg; int *pfd; @@ -73,9 +57,10 @@ static void client_cb(struct uloop_fd *sock, unsigned int events) msghdr.msg_controllen = cmsg->cmsg_len; /* first try to tx more pending data */ - while ((ub = ubus_msg_head(cl))) { + list_for_each_entry_safe(ubl, ubl2, &cl->tx_queue, list) { ssize_t written; + ub = ubl->msg; written = ubus_msg_writev(sock->fd, ub, cl->txq_ofs); if (written < 0) { switch(errno) { @@ -92,12 +77,12 @@ static void client_cb(struct uloop_fd *sock, unsigned int events) if (cl->txq_ofs < ub->len + sizeof(ub->hdr)) break; - ubus_msg_dequeue(cl); + ubus_msg_list_free(ubl); } /* prevent further ULOOP_WRITE events if we don't have data * to send anymore */ - if (!ubus_msg_head(cl) && (events & ULOOP_WRITE)) + if (list_empty(&cl->tx_queue) && (events & ULOOP_WRITE)) uloop_fd_add(sock, ULOOP_READ | ULOOP_EDGE_TRIGGER); retry: @@ -171,7 +156,7 @@ retry: } out: - if (!sock->eof || ubus_msg_head(cl)) + if (!sock->eof || !list_empty(&cl->tx_queue)) return; disconnect: