summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2014-01-22 04:58:19 +0400
committerValentin Bartenev <vbart@nginx.com>2014-01-22 04:58:19 +0400
commite62156d8292eb288ad456d6ba1eb96db7ce2a6b6 (patch)
tree21fa9d31d24c75a79521af09a2f2666a6dc51161
parent650984cd20fe526a6eef0c014fbd92a06aeb1f7a (diff)
downloadnginx-e62156d8292eb288ad456d6ba1eb96db7ce2a6b6.tar.gz
nginx-e62156d8292eb288ad456d6ba1eb96db7ce2a6b6.tar.bz2
SPDY: use frame->next pointer to chain free frames.
There is no need in separate "free" pointer and like it is for ngx_chain_t the "next" pointer can be used. But after this change successfully handled frame should not be accessed, so the frame handling cycle was improved to store pointer to the next frame before processing. Also worth noting that initializing "free" pointer to NULL in the original code was surplus.
-rw-r--r--src/http/ngx_http_spdy.c10
-rw-r--r--src/http/ngx_http_spdy.h2
-rw-r--r--src/http/ngx_http_spdy_filter_module.c6
3 files changed, 7 insertions, 11 deletions
diff --git a/src/http/ngx_http_spdy.c b/src/http/ngx_http_spdy.c
index a040a388f..b5aa9931c 100644
--- a/src/http/ngx_http_spdy.c
+++ b/src/http/ngx_http_spdy.c
@@ -527,7 +527,9 @@ ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc)
}
}
- for ( /* void */ ; out; out = out->next) {
+ for ( /* void */ ; out; out = fn) {
+ fn = out->next;
+
if (out->handler(sc, out) != NGX_OK) {
out->blocked = 1;
out->priority = NGX_SPDY_HIGHEST_PRIORITY;
@@ -1644,7 +1646,7 @@ ngx_http_spdy_get_ctl_frame(ngx_http_spdy_connection_t *sc, size_t size,
frame = sc->free_ctl_frames;
if (frame) {
- sc->free_ctl_frames = frame->free;
+ sc->free_ctl_frames = frame->next;
cl = frame->first;
cl->buf->pos = cl->buf->start;
@@ -1674,8 +1676,6 @@ ngx_http_spdy_get_ctl_frame(ngx_http_spdy_connection_t *sc, size_t size,
frame->stream = NULL;
}
- frame->free = NULL;
-
#if (NGX_DEBUG)
if (size > NGX_SPDY_CTL_FRAME_BUFFER_SIZE - NGX_SPDY_FRAME_HEADER_SIZE) {
ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0,
@@ -1705,7 +1705,7 @@ ngx_http_spdy_ctl_frame_handler(ngx_http_spdy_connection_t *sc,
return NGX_AGAIN;
}
- frame->free = sc->free_ctl_frames;
+ frame->next = sc->free_ctl_frames;
sc->free_ctl_frames = frame;
return NGX_OK;
diff --git a/src/http/ngx_http_spdy.h b/src/http/ngx_http_spdy.h
index 49b07caef..3dab0fecb 100644
--- a/src/http/ngx_http_spdy.h
+++ b/src/http/ngx_http_spdy.h
@@ -141,8 +141,6 @@ struct ngx_http_spdy_out_frame_s {
ngx_int_t (*handler)(ngx_http_spdy_connection_t *sc,
ngx_http_spdy_out_frame_t *frame);
- ngx_http_spdy_out_frame_t *free;
-
ngx_http_spdy_stream_t *stream;
size_t size;
diff --git a/src/http/ngx_http_spdy_filter_module.c b/src/http/ngx_http_spdy_filter_module.c
index 7a7559ee8..bc39ec2aa 100644
--- a/src/http/ngx_http_spdy_filter_module.c
+++ b/src/http/ngx_http_spdy_filter_module.c
@@ -587,7 +587,6 @@ ngx_http_spdy_header_filter(ngx_http_request_t *r)
frame->first = cl;
frame->last = cl;
frame->handler = ngx_http_spdy_syn_frame_handler;
- frame->free = NULL;
frame->stream = stream;
frame->size = len;
frame->priority = stream->priority;
@@ -821,7 +820,7 @@ ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
frame = stream->free_frames;
if (frame) {
- stream->free_frames = frame->free;
+ stream->free_frames = frame->next;
} else {
frame = ngx_palloc(stream->request->pool,
@@ -881,7 +880,6 @@ ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
frame->first = first;
frame->last = last;
frame->handler = ngx_http_spdy_data_frame_handler;
- frame->free = NULL;
frame->stream = stream;
frame->size = NGX_SPDY_FRAME_HEADER_SIZE + len;
frame->priority = stream->priority;
@@ -1051,7 +1049,7 @@ ngx_http_spdy_handle_frame(ngx_http_spdy_stream_t *stream,
stream->out_closed = 1;
}
- frame->free = stream->free_frames;
+ frame->next = stream->free_frames;
stream->free_frames = frame;
stream->queued--;