changeset 5530:827e53c136b0

SPDY: use ngx_queue_t to queue streams for post processing. It simplifies the code and allows easy reuse the same queue pointer to store streams in various queues with different requirements. Future implementation of SPDY/3.1 will take advantage of this quality.
author Valentin Bartenev <vbart@nginx.com>
date Mon, 20 Jan 2014 20:56:49 +0400
parents e4adaa47af65
children 97e3769637a7
files src/http/ngx_http_spdy.c src/http/ngx_http_spdy.h src/http/ngx_http_spdy_filter_module.c
diffstat 3 files changed, 21 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/ngx_http_spdy.c	Wed Jan 22 04:58:19 2014 +0400
+++ b/src/http/ngx_http_spdy.c	Mon Jan 20 20:56:49 2014 +0400
@@ -302,6 +302,8 @@
         return;
     }
 
+    ngx_queue_init(&sc->posted);
+
     c->data = sc;
 
     rev->handler = ngx_http_spdy_read_handler;
@@ -405,8 +407,9 @@
 ngx_http_spdy_write_handler(ngx_event_t *wev)
 {
     ngx_int_t                    rc;
+    ngx_queue_t                 *q;
     ngx_connection_t            *c;
-    ngx_http_spdy_stream_t      *stream, *s, *sn;
+    ngx_http_spdy_stream_t      *stream;
     ngx_http_spdy_connection_t  *sc;
 
     c = wev->data;
@@ -430,18 +433,13 @@
         return;
     }
 
-    stream = NULL;
-
-    for (s = sc->last_stream; s; s = sn) {
-         sn = s->next;
-         s->next = stream;
-         stream = s;
-    }
-
-    sc->last_stream = NULL;
-
-    for ( /* void */ ; stream; stream = sn) {
-        sn = stream->next;
+    while (!ngx_queue_empty(&sc->posted)) {
+        q = ngx_queue_head(&sc->posted);
+
+        ngx_queue_remove(q);
+
+        stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
+
         stream->handled = 0;
 
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
@@ -2593,6 +2591,11 @@
                    "spdy close stream %ui, queued %ui, processing %ui",
                    stream->id, stream->queued, sc->processing);
 
+    if (stream->handled) {
+        stream->handled = 0;
+        ngx_queue_remove(&stream->queue);
+    }
+
     fc = stream->request->connection;
 
     if (stream->queued) {
@@ -2614,15 +2617,6 @@
         sc->stream = NULL;
     }
 
-    if (stream->handled) {
-        for (s = sc->last_stream; s; s = s->next) {
-            if (s->next == stream) {
-                s->next = stream->next;
-                break;
-            }
-        }
-    }
-
     sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
                                         ngx_http_spdy_module);
 
--- a/src/http/ngx_http_spdy.h	Wed Jan 22 04:58:19 2014 +0400
+++ b/src/http/ngx_http_spdy.h	Mon Jan 20 20:56:49 2014 +0400
@@ -96,7 +96,8 @@
     ngx_http_spdy_stream_t         **streams_index;
 
     ngx_http_spdy_out_frame_t       *last_out;
-    ngx_http_spdy_stream_t          *last_stream;
+
+    ngx_queue_t                      posted;
 
     ngx_http_spdy_stream_t          *stream;
 
@@ -116,7 +117,6 @@
     ngx_http_request_t              *request;
     ngx_http_spdy_connection_t      *connection;
     ngx_http_spdy_stream_t          *index;
-    ngx_http_spdy_stream_t          *next;
 
     ngx_uint_t                       header_buffers;
     ngx_uint_t                       queued;
@@ -125,6 +125,8 @@
     ngx_chain_t                     *free_data_headers;
     ngx_chain_t                     *free_bufs;
 
+    ngx_queue_t                      queue;
+
     unsigned                         priority:2;
     unsigned                         handled:1;
     unsigned                         blocked:1;
--- a/src/http/ngx_http_spdy_filter_module.c	Wed Jan 22 04:58:19 2014 +0400
+++ b/src/http/ngx_http_spdy_filter_module.c	Mon Jan 20 20:56:49 2014 +0400
@@ -1073,9 +1073,7 @@
         wev->delayed = 0;
 
         stream->handled = 1;
-
-        stream->next = sc->last_stream;
-        sc->last_stream = stream;
+        ngx_queue_insert_tail(&sc->posted, &stream->queue);
     }
 }