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;


Reply via email to