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);
}
}