mirror of
https://github.com/nginx/nginx.git
synced 2025-06-29 02:30:39 +08:00
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.
This commit is contained in:
parent
3ddf9ccfce
commit
abcbe54219
@ -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 *wev)
|
||||
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 @@ ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc)
|
||||
"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_stream_t *stream, ngx_int_t rc)
|
||||
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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -1073,9 +1073,7 @@ ngx_http_spdy_handle_stream(ngx_http_spdy_connection_t *sc,
|
||||
wev->delayed = 0;
|
||||
|
||||
stream->handled = 1;
|
||||
|
||||
stream->next = sc->last_stream;
|
||||
sc->last_stream = stream;
|
||||
ngx_queue_insert_tail(&sc->posted, &stream->queue);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user