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;