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.
This commit is contained in:
Valentin Bartenev 2014-01-22 04:58:19 +04:00
parent 650984cd20
commit e62156d829
3 changed files with 7 additions and 11 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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--;