From b6f6f967338547518f12dd5e7b037ece69dcd84e Mon Sep 17 00:00:00 2001 From: Joe Orton Date: Mon, 23 Jan 2012 16:57:07 +0000 Subject: [PATCH] * server/core_filters.c (send_brigade_nonblocking): Use a non-blocking bucket read, allowing any pending data to be flushed before trying a (potentially slow) blocking read. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1234899 13f79535-47bb-0310-9956-ffa450edef68 --- server/core_filters.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/server/core_filters.c b/server/core_filters.c index b9c4d9ffea..42da5c279f 100644 --- a/server/core_filters.c +++ b/server/core_filters.c @@ -656,10 +656,26 @@ static apr_status_t send_brigade_nonblocking(apr_socket_t *s, if (!APR_BUCKET_IS_METADATA(bucket)) { const char *data; apr_size_t length; - rv = apr_bucket_read(bucket, &data, &length, APR_BLOCK_READ); + + /* Non-blocking read first, in case this is a morphing + * bucket type. */ + rv = apr_bucket_read(bucket, &data, &length, APR_NONBLOCK_READ); + if (APR_STATUS_IS_EAGAIN(rv)) { + /* Read would block; flush any pending data and retry. */ + if (nvec) { + rv = writev_nonblocking(s, vec, nvec, bb, bytes_written, c); + if (rv) { + return rv; + } + nvec = 0; + } + + rv = apr_bucket_read(bucket, &data, &length, APR_BLOCK_READ); + } if (rv != APR_SUCCESS) { return rv; } + /* reading may have split the bucket, so recompute next: */ next = APR_BUCKET_NEXT(bucket); vec[nvec].iov_base = (char *)data; -- 2.40.0