Author: rhuijben
Date: Tue Nov 24 11:52:53 2015
New Revision: 1716111
URL: http://svn.apache.org/viewvc?rev=1716111&view=rev
Log:
Standardize the number of iov records we use a tiny bit, to avoid huge
unneeded stack and heap allocations on platforms with IOV_MAX on something
like 1024, while performance behavior is different than on other platforms
where we limit ourselves to just 50 while there is no real limit
(as on Windows).
* buckets/buckets.c
(serf__bucket_drain): Use standard iov size.
* buckets/fcgi_buckets.c
(serf_fcgi_frame_refill): Use standard iov size.
* buckets/http2_frame_buckets.c
(http2_prepare_frame): Use standard iov size.
* incoming.c
(serf_incoming_create2): Remove setting of unused var.
* protocols/http2_protocol.c
(http2_bucket_processor): Use standard iov size.
* protocols/http2_stream.c
(serf_http2__stream_processor): Use standard iov size.
* pump.c
(serf_pump__write): Use actual iov size.
* serf_private.h
(COUNT_OF): Define.
(SERF__STD_IOV_COUNT): New define.
(serf_pump_t): Limit the nr of iovecs a bit.
(serf_incoming_t): Remove unused variables.
Modified:
serf/trunk/buckets/buckets.c
serf/trunk/buckets/fcgi_buckets.c
serf/trunk/buckets/http2_frame_buckets.c
serf/trunk/incoming.c
serf/trunk/protocols/http2_protocol.c
serf/trunk/protocols/http2_stream.c
serf/trunk/pump.c
serf/trunk/serf_private.h
Modified: serf/trunk/buckets/buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/buckets.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/buckets/buckets.c (original)
+++ serf/trunk/buckets/buckets.c Tue Nov 24 11:52:53 2015
@@ -359,11 +359,12 @@ void serf__bucket_drain(serf_bucket_t *b
apr_status_t status;
do {
- struct iovec vecs[IOV_MAX];
+ struct iovec vecs[SERF__STD_IOV_COUNT];
int vecs_used;
status = serf_bucket_read_iovec(bucket, SERF_READ_ALL_AVAIL,
- IOV_MAX, vecs, &vecs_used);
+ COUNT_OF(vecs), vecs,
+ &vecs_used);
}
while (status == APR_SUCCESS);
}
Modified: serf/trunk/buckets/fcgi_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/fcgi_buckets.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/buckets/fcgi_buckets.c (original)
+++ serf/trunk/buckets/fcgi_buckets.c Tue Nov 24 11:52:53 2015
@@ -691,11 +691,11 @@ static apr_status_t serf_fcgi_frame_refi
}
else
{
- struct iovec vecs[IOV_MAX];
+ struct iovec vecs[SERF__STD_IOV_COUNT];
int vecs_used;
- status = serf_bucket_read_iovec(head, 0xFFF0,
- IOV_MAX, vecs, &vecs_used);
+ status = serf_bucket_read_iovec(head, 0xFFF0, COUNT_OF(vecs),
+ vecs, &vecs_used);
if (SERF_BUCKET_READ_ERROR(status))
return status;
Modified: serf/trunk/buckets/http2_frame_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/http2_frame_buckets.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/buckets/http2_frame_buckets.c (original)
+++ serf/trunk/buckets/http2_frame_buckets.c Tue Nov 24 11:52:53 2015
@@ -698,11 +698,11 @@ http2_prepare_frame(serf_bucket_t *bucke
else {
/* Our payload doesn't know how long it is. Our only option
now is to create the actual data */
- struct iovec vecs[IOV_MAX];
+ struct iovec vecs[SERF__STD_IOV_COUNT];
apr_status_t status;
status = serf_bucket_read_iovec(ctx->stream, ctx->max_payload_size,
- IOV_MAX, vecs, &vecs_used);
+ COUNT_OF(vecs), vecs, &vecs_used);
if (SERF_BUCKET_READ_ERROR(status))
return status;
@@ -743,7 +743,7 @@ http2_prepare_frame(serf_bucket_t *bucke
apr_size_t read;
status = serf_bucket_read_iovec(ctx->stream,
ctx->max_payload_size - total
+ 1,
- IOV_MAX, vecs, &vecs_used);
+ COUNT_OF(vecs), vecs,
&vecs_used);
if (SERF_BUCKET_READ_ERROR(status)) {
serf_bucket_mem_free(bucket->allocator, data);
Modified: serf/trunk/incoming.c
URL:
http://svn.apache.org/viewvc/serf/trunk/incoming.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/incoming.c (original)
+++ serf/trunk/incoming.c Tue Nov 24 11:52:53 2015
@@ -566,7 +566,6 @@ apr_status_t serf_incoming_create2(
ic->skt = insock;
ic->wait_for_connect = true;
- ic->vec_len = 0;
/* Detect HTTP 1 or 2 via peek operation */
ic->framing_type = SERF_CONNECTION_FRAMING_TYPE_NONE;
Modified: serf/trunk/protocols/http2_protocol.c
URL:
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_protocol.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/protocols/http2_protocol.c (original)
+++ serf/trunk/protocols/http2_protocol.c Tue Nov 24 11:52:53 2015
@@ -967,13 +967,13 @@ http2_bucket_processor(void *baton,
serf_http2_protocol_t *h2,
serf_bucket_t *frame_bucket)
{
- struct iovec vecs[IOV_MAX];
+ struct iovec vecs[SERF__STD_IOV_COUNT];
int vecs_used;
serf_bucket_t *payload = baton;
apr_status_t status;
- status = serf_bucket_read_iovec(payload, SERF_READ_ALL_AVAIL, IOV_MAX,
- vecs, &vecs_used);
+ status = serf_bucket_read_iovec(payload, SERF_READ_ALL_AVAIL,
+ COUNT_OF(vecs), vecs, &vecs_used);
if (APR_STATUS_IS_EOF(status))
{
Modified: serf/trunk/protocols/http2_stream.c
URL:
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_stream.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/protocols/http2_stream.c (original)
+++ serf/trunk/protocols/http2_stream.c Tue Nov 24 11:52:53 2015
@@ -799,13 +799,13 @@ serf_http2__stream_processor(void *baton
while (!status)
{
- struct iovec vecs[IOV_MAX];
+ struct iovec vecs[SERF__STD_IOV_COUNT];
int vecs_used;
/* Drain the bucket as efficiently as possible */
status = serf_bucket_read_iovec(stream->data->response_agg,
- SERF_READ_ALL_AVAIL,
- IOV_MAX, vecs, &vecs_used);
+ SERF_READ_ALL_AVAIL, COUNT_OF(vecs),
+ vecs, &vecs_used);
if (vecs_used) {
/* We have data... What should we do with it? */
Modified: serf/trunk/pump.c
URL:
http://svn.apache.org/viewvc/serf/trunk/pump.c?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/pump.c (original)
+++ serf/trunk/pump.c Tue Nov 24 11:52:53 2015
@@ -323,7 +323,7 @@ apr_status_t serf_pump__write(serf_pump_
pump->hit_eof = false;
read_status = serf_bucket_read_iovec(pump->ostream_head,
SERF_READ_ALL_AVAIL,
- IOV_MAX,
+ COUNT_OF(pump->vec),
pump->vec,
&pump->vec_len);
Modified: serf/trunk/serf_private.h
URL:
http://svn.apache.org/viewvc/serf/trunk/serf_private.h?rev=1716111&r1=1716110&r2=1716111&view=diff
==============================================================================
--- serf/trunk/serf_private.h (original)
+++ serf/trunk/serf_private.h Tue Nov 24 11:52:53 2015
@@ -55,6 +55,10 @@ typedef int serf__bool_t; /* Not _Bool *
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
+/* Define a COUNT_OF macro if we don't already have one */
+#ifndef COUNT_OF
+#define COUNT_OF(x) (sizeof(x) / sizeof(x[0]))
+#endif
/* ### what the hell? why does the APR interface have a "size" ??
### the implication is that, if we bust this limit, we'd need to
@@ -68,6 +72,11 @@ typedef int serf__bool_t; /* Not _Bool *
#define IOV_MAX 50
#endif
+/* But we use our own limit in most cases. Typically 50 on Windows
+ (see IOV_MAX definition above) and typically 64 on posix */
+#define SERF__STD_IOV_COUNT MIN(IOV_MAX, 64)
+
+
/* Older versions of APR do not have this macro. */
#ifdef APR_SIZE_MAX
#define REQUESTED_MAX APR_SIZE_MAX
@@ -168,8 +177,8 @@ typedef struct serf_pump_t
apr_socket_t *skt;
/* Outgoing vecs, waiting to be written.
- Read from ostream_head */
- struct iovec vec[IOV_MAX];
+ Read from ostream_head as outgoing data buffer */
+ struct iovec vec[SERF__STD_IOV_COUNT];
int vec_len;
/* True when connection failed while writing */
@@ -429,9 +438,6 @@ struct serf_incoming_t {
apr_int16_t seen_in_pollset;
- struct iovec vec[IOV_MAX];
- int vec_len;
-
serf_connection_setup_t setup;
void *setup_baton;
serf_incoming_closed_t closed;