From: Andre Noll Date: Tue, 20 Sep 2011 22:55:05 +0000 (+0200) Subject: http_recv: Fill both buffer pool buffers simultaneously. X-Git-Tag: v0.4.9~4^2 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=468ad2934ec2bd6131d6c97c23d5c547c6d1a6b3 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. --- 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; }