Mercurial > hg > nginx
comparison src/http/ngx_http_spdy.c @ 5528:d5de6c25b759
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.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 22 Jan 2014 04:58:19 +0400 |
parents | f3f7b72ca6e9 |
children | e4adaa47af65 |
comparison
equal
deleted
inserted
replaced
5527:f3f7b72ca6e9 | 5528:d5de6c25b759 |
---|---|
525 if (wev->timer_set) { | 525 if (wev->timer_set) { |
526 ngx_del_timer(wev); | 526 ngx_del_timer(wev); |
527 } | 527 } |
528 } | 528 } |
529 | 529 |
530 for ( /* void */ ; out; out = out->next) { | 530 for ( /* void */ ; out; out = fn) { |
531 fn = out->next; | |
532 | |
531 if (out->handler(sc, out) != NGX_OK) { | 533 if (out->handler(sc, out) != NGX_OK) { |
532 out->blocked = 1; | 534 out->blocked = 1; |
533 out->priority = NGX_SPDY_HIGHEST_PRIORITY; | 535 out->priority = NGX_SPDY_HIGHEST_PRIORITY; |
534 break; | 536 break; |
535 } | 537 } |
1642 ngx_http_spdy_out_frame_t *frame; | 1644 ngx_http_spdy_out_frame_t *frame; |
1643 | 1645 |
1644 frame = sc->free_ctl_frames; | 1646 frame = sc->free_ctl_frames; |
1645 | 1647 |
1646 if (frame) { | 1648 if (frame) { |
1647 sc->free_ctl_frames = frame->free; | 1649 sc->free_ctl_frames = frame->next; |
1648 | 1650 |
1649 cl = frame->first; | 1651 cl = frame->first; |
1650 cl->buf->pos = cl->buf->start; | 1652 cl->buf->pos = cl->buf->start; |
1651 | 1653 |
1652 } else { | 1654 } else { |
1671 frame->first = cl; | 1673 frame->first = cl; |
1672 frame->last = cl; | 1674 frame->last = cl; |
1673 frame->handler = ngx_http_spdy_ctl_frame_handler; | 1675 frame->handler = ngx_http_spdy_ctl_frame_handler; |
1674 frame->stream = NULL; | 1676 frame->stream = NULL; |
1675 } | 1677 } |
1676 | |
1677 frame->free = NULL; | |
1678 | 1678 |
1679 #if (NGX_DEBUG) | 1679 #if (NGX_DEBUG) |
1680 if (size > NGX_SPDY_CTL_FRAME_BUFFER_SIZE - NGX_SPDY_FRAME_HEADER_SIZE) { | 1680 if (size > NGX_SPDY_CTL_FRAME_BUFFER_SIZE - NGX_SPDY_FRAME_HEADER_SIZE) { |
1681 ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0, | 1681 ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0, |
1682 "requested control frame is too big: %uz", size); | 1682 "requested control frame is too big: %uz", size); |
1703 | 1703 |
1704 if (buf->pos != buf->last) { | 1704 if (buf->pos != buf->last) { |
1705 return NGX_AGAIN; | 1705 return NGX_AGAIN; |
1706 } | 1706 } |
1707 | 1707 |
1708 frame->free = sc->free_ctl_frames; | 1708 frame->next = sc->free_ctl_frames; |
1709 sc->free_ctl_frames = frame; | 1709 sc->free_ctl_frames = frame; |
1710 | 1710 |
1711 return NGX_OK; | 1711 return NGX_OK; |
1712 } | 1712 } |
1713 | 1713 |