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