Author: rhuijben
Date: Mon Nov 16 19:25:26 2015
New Revision: 1714653

URL: http://svn.apache.org/viewvc?rev=1714653&view=rev
Log:
Cache pointers to a few booleans in the http2 protocol state to avoid checking
for conn and client over and over again.

* protocols/http2_protocol.c
  (serf_http2_protocol_t): Store ctx and the pollset dirty state.
  (serf__http2_protocol_init,
   serf__http2_protocol_init_server): Init values.
  (serf_http2__enqueue_frame): Tweak code. fix a few bugs when using serf
    as a http server.

  (http2_outgoing_read): Set stream if it happens to be NULL.

Modified:
    serf/trunk/protocols/http2_protocol.c

Modified: serf/trunk/protocols/http2_protocol.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_protocol.c?rev=1714653&r1=1714652&r2=1714653&view=diff
==============================================================================
--- serf/trunk/protocols/http2_protocol.c (original)
+++ serf/trunk/protocols/http2_protocol.c Mon Nov 16 19:25:26 2015
@@ -120,6 +120,9 @@ struct serf_http2_protocol_t
     apr_pool_t *pool;
     serf_connection_t *conn; /* Either CONN or CLIENT is set */
     serf_incoming_t *client;
+    serf_context_t *ctx;
+    bool *dirty_pollset;
+    apr_int16_t *req_events;
     serf_bucket_t *stream, *ostream;
     serf_bucket_alloc_t *allocator;
 
@@ -235,6 +238,9 @@ void serf__http2_protocol_init(serf_conn
     h2 = apr_pcalloc(protocol_pool, sizeof(*h2));
     h2->pool = protocol_pool;
     h2->conn = conn;
+    h2->ctx = conn->ctx;
+    h2->dirty_pollset = &conn->dirty_conn;
+    h2->req_events = &conn->reqevents;
     h2->stream = conn->stream;
     h2->ostream = conn->ostream_tail;
     h2->allocator = conn->allocator;
@@ -326,6 +332,9 @@ void serf__http2_protocol_init_server(se
     h2 = apr_pcalloc(protocol_pool, sizeof(*h2));
     h2->pool = protocol_pool;
     h2->client = client;
+    h2->ctx = client->ctx;
+    h2->dirty_pollset = &client->dirty_conn;
+    h2->req_events = &client->reqevents;
     h2->stream = client->stream;
     h2->ostream = client->ostream_tail;
     h2->allocator = client->allocator;
@@ -430,10 +439,10 @@ serf_http2__enqueue_frame(serf_http2_pro
                           int pump)
 {
     apr_status_t status;
+    bool want_write;
 
-    if (!pump
-        && !((h2->conn && h2->conn->dirty_conn)
-             || (h2->client && h2->client->dirty_conn)))
+
+    if (!pump && !*h2->dirty_pollset)
     {
         const char *data;
         apr_size_t len;
@@ -450,8 +459,8 @@ serf_http2__enqueue_frame(serf_http2_pro
 
         if (len == 0)
         {
-            h2->conn->dirty_conn = TRUE;
-            h2->conn->ctx->dirty_pollset = TRUE;
+            *h2->dirty_pollset = true;
+            h2->ctx->dirty_pollset = true;
         }
     }
 
@@ -466,21 +475,16 @@ serf_http2__enqueue_frame(serf_http2_pro
     else
         status = serf__incoming_client_flush(h2->client, TRUE);
 
-    if (APR_STATUS_IS_EAGAIN(status))
-        return APR_SUCCESS;
-    else if (status)
-        return status;
+    want_write = APR_STATUS_IS_EAGAIN(status);
 
-    if (h2->conn) {
-        h2->conn->dirty_conn = true;
-        h2->conn->ctx->dirty_pollset = true;
-    }
-    else {
-        h2->client->dirty_conn = true;
-        h2->client->ctx->dirty_pollset = true;
+    if ((want_write && !(*h2->req_events & APR_POLLOUT))
+        || (!want_write && (*h2->req_events & APR_POLLOUT)))
+    {
+        *h2->dirty_pollset = true;
+        h2->ctx->dirty_pollset = true;
     }
 
-    return APR_SUCCESS;
+    return status;
 }
 
 /* Implements serf_bucket_prefix_handler_t.
@@ -1641,6 +1645,7 @@ static apr_status_t http2_write_data(ser
 static apr_status_t
 http2_outgoing_read(serf_connection_t *conn)
 {
+    serf_http2_protocol_t *h2 = conn->protocol_baton;
     apr_status_t status;
 
     /* If the stop_writing flag was set on the connection, reset it now because
@@ -1652,7 +1657,10 @@ http2_outgoing_read(serf_connection_t *c
         conn->ctx->dirty_pollset = 1;
     }
 
-    status = http2_process(conn->protocol_baton);
+    if (h2->stream == NULL)
+        h2->stream = conn->stream;
+
+    status = http2_process(h2);
 
     if (!status)
         return APR_SUCCESS;
@@ -1698,7 +1706,7 @@ http2_outgoing_write(serf_connection_t *
 
       /* Probably nothing to write. Connection will check new requests */
     conn->dirty_conn = 1;
-    conn->ctx->dirty_pollset = 1;
+    h2->ctx->dirty_pollset = 1;
 
     return APR_SUCCESS;
 }
@@ -1817,7 +1825,7 @@ http2_incoming_write(serf_incoming_t *cl
 
     /* Probably nothing to write. Connection will check new requests */
     client->dirty_conn = true;
-    client->ctx->dirty_pollset = true;
+    h2->ctx->dirty_pollset = true;
 
     return APR_SUCCESS;
 }


Reply via email to