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.
diff --git a/src/http/ngx_http_spdy.c b/src/http/ngx_http_spdy.c
index accfcb1..27c8aa1 100644
--- a/src/http/ngx_http_spdy.c
+++ b/src/http/ngx_http_spdy.c
@@ -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;
+    while (!ngx_queue_empty(&sc->posted)) {
+        q = ngx_queue_head(&sc->posted);
 
-    for (s = sc->last_stream; s; s = sn) {
-         sn = s->next;
-         s->next = stream;
-         stream = s;
-    }
+        ngx_queue_remove(q);
 
-    sc->last_stream = NULL;
+        stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
 
-    for ( /* void */ ; stream; stream = sn) {
-        sn = stream->next;
         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);
 
diff --git a/src/http/ngx_http_spdy.h b/src/http/ngx_http_spdy.h
index 652b88f..8caa5b0 100644
--- a/src/http/ngx_http_spdy.h
+++ b/src/http/ngx_http_spdy.h
@@ -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;
diff --git a/src/http/ngx_http_spdy_filter_module.c b/src/http/ngx_http_spdy_filter_module.c
index 6cf4aea..0ec9028 100644
--- a/src/http/ngx_http_spdy_filter_module.c
+++ b/src/http/ngx_http_spdy_filter_module.c
@@ -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);
     }
 }