From 468ad2934ec2bd6131d6c97c23d5c547c6d1a6b3 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 21 Sep 2011 00:55:05 +0200 Subject: [PATCH] http_recv: Fill both buffer pool buffers simultaneously. This changes http_recv_post_select() to call readv_nonblock() rather than read_nonblock() to read data from the socket, just like the udp and dccp receivers do. This saves one iteration of the scheduler loop if the end of the buffer pool area is reached. --- http_recv.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/http_recv.c b/http_recv.c index d4fe29ad..e6031e75 100644 --- a/http_recv.c +++ b/http_recv.c @@ -79,14 +79,14 @@ static void http_recv_post_select(struct sched *s, struct task *t) struct receiver_node *rn = container_of(t, struct receiver_node, task); struct private_http_recv_data *phd = rn->private_data; struct btr_node *btrn = rn->btrn; - int ret; - char *buf; - size_t sz, n; + int ret, iovcnt; + struct iovec iov[2]; + size_t num_bytes; t->error = 0; ret = btr_node_status(btrn, 0, BTR_NT_ROOT); if (ret < 0) - goto err; + goto out; if (ret == 0) return; if (phd->status == HTTP_CONNECTED) { @@ -98,14 +98,14 @@ static void http_recv_post_select(struct sched *s, struct task *t) ret = send_va_buffer(rn->fd, "%s", rq); free(rq); if (ret < 0) - goto err; + goto out; phd->status = HTTP_SENT_GET_REQUEST; return; } if (phd->status == HTTP_SENT_GET_REQUEST) { ret = read_pattern(rn->fd, HTTP_OK_MSG, strlen(HTTP_OK_MSG), &s->rfds); if (ret < 0) - goto err; + goto out; if (ret == 0) return; PARA_INFO_LOG("received ok msg, streaming\n"); @@ -113,15 +113,21 @@ static void http_recv_post_select(struct sched *s, struct task *t) return; } ret = -E_HTTP_RECV_OVERRUN; - sz = btr_pool_get_buffer(rn->btrp, &buf); - if (sz == 0) - goto err; - ret = read_nonblock(rn->fd, buf, sz, &s->rfds, &n); - if (n > 0) - btr_add_output_pool(rn->btrp, n, btrn); + iovcnt = btr_pool_get_buffers(rn->btrp, iov); + if (iovcnt == 0) + goto out; + ret = readv_nonblock(rn->fd, iov, iovcnt, &s->rfds, &num_bytes); + if (num_bytes == 0) + goto out; + if (num_bytes <= iov[0].iov_len) /* only the first buffer was filled */ + btr_add_output_pool(rn->btrp, num_bytes, btrn); + else { /* both buffers contain data */ + btr_add_output_pool(rn->btrp, iov[0].iov_len, btrn); + btr_add_output_pool(rn->btrp, num_bytes - iov[0].iov_len, btrn); + } +out: if (ret >= 0) return; -err: btr_remove_node(rn->btrn); t->error = ret; } -- 2.39.5