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
+++ b/src/http/ngx_http_spdy.c
@@ -302,6 +302,8 @@ ngx_http_spdy_init(ngx_event_t *rev)
         return;
     }
 
+    ngx_queue_init(&sc->posted);
+
     c->data = sc;
 
     rev->handler = ngx_http_spdy_read_handler;
@@ -405,8 +407,9 @@ static void
 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 @@ ngx_http_spdy_write_handler(ngx_event_t 
         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 @@ ngx_http_spdy_close_stream(ngx_http_spdy
                    "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 @@ ngx_http_spdy_close_stream(ngx_http_spdy
         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
+++ b/src/http/ngx_http_spdy.h
@@ -96,7 +96,8 @@ struct ngx_http_spdy_connection_s {
     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 @@ struct ngx_http_spdy_stream_s {
     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 @@ struct ngx_http_spdy_stream_s {
     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
+++ b/src/http/ngx_http_spdy_filter_module.c
@@ -1073,9 +1073,7 @@ ngx_http_spdy_handle_stream(ngx_http_spd
         wev->delayed = 0;
 
         stream->handled = 1;
-
-        stream->next = sc->last_stream;
-        sc->last_stream = stream;
+        ngx_queue_insert_tail(&sc->posted, &stream->queue);
     }
 }