]> git.kaiwu.me - nginx.git/commitdiff
SPDY: use frame->next pointer to chain free frames.
authorValentin Bartenev <vbart@nginx.com>
Wed, 22 Jan 2014 00:58:19 +0000 (04:58 +0400)
committerValentin Bartenev <vbart@nginx.com>
Wed, 22 Jan 2014 00:58:19 +0000 (04:58 +0400)
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.

src/http/ngx_http_spdy.c
src/http/ngx_http_spdy.h
src/http/ngx_http_spdy_filter_module.c

index a040a388f0bfbd57a8c0009816345d132bf13649..b5aa9931c60a296fcffcffe7de5cb8d047e3a3fa 100644 (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;
index 49b07caefa83d9d640cbf747f30041967c08897f..3dab0fecba955d464e1f7f22e61c624955d556fd 100644 (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;
 
index 7a7559ee8b5902c1f772c0814a11bca901baa3d2..bc39ec2aa1f06d95762e5453be911f1ddf6986ad 100644 (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--;