static void ngx_http_create_locations_list(ngx_queue_t *locations, ngx_queue_t *q) { u_char *name; size_t len; ngx_queue_t *x, tail; ngx_http_location_queue_t *lq, *lx; if (q == ngx_queue_last(locations)) { return; } lq = (ngx_http_location_queue_t *) q; if (lq->inclusive == NULL) { ngx_http_create_locations_list(locations, ngx_queue_next(q)); return; } len = lq->name->len; name = lq->name->data; for (x = ngx_queue_next(q); x != ngx_queue_sentinel(locations); x = ngx_queue_next(x)) { lx = (ngx_http_location_queue_t *) x; if (len > lx->name->len || (ngx_strncmp(name, lx->name->data, len) != 0)) { break; } } q = ngx_queue_next(q); if (q == x) { ngx_http_create_locations_list(locations, x); return; } ngx_queue_split(locations, q, &tail); ngx_queue_add(&lq->list, &tail); if (x == ngx_queue_sentinel(locations)) { ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list)); return; } ngx_queue_split(&lq->list, x, &tail); ngx_queue_add(locations, &tail); ngx_http_create_locations_list(&lq->list, ngx_queue_head(&lq->list)); ngx_http_create_locations_list(locations, x); }
static void ngx_http_v2_filter_cleanup(void *data) { ngx_http_v2_stream_t *stream = data; size_t window; ngx_http_v2_out_frame_t *frame, **fn; ngx_http_v2_connection_t *h2c; if (stream->handled) { stream->handled = 0; ngx_queue_remove(&stream->queue); } if (stream->queued == 0) { return; } window = 0; h2c = stream->connection; fn = &h2c->last_out; for ( ;; ) { frame = *fn; if (frame == NULL) { break; } if (frame->stream == stream && !frame->blocked) { *fn = frame->next; window += frame->length; if (--stream->queued == 0) { break; } continue; } fn = &frame->next; } if (h2c->send_window == 0 && window && !ngx_queue_empty(&h2c->waiting)) { ngx_queue_add(&h2c->posted, &h2c->waiting); ngx_queue_init(&h2c->waiting); } h2c->send_window += window; }
static void ngx_http_spdy_filter_cleanup(void *data) { ngx_http_spdy_stream_t *stream = data; size_t delta; ngx_http_spdy_out_frame_t *frame, **fn; ngx_http_spdy_connection_t *sc; if (stream->handled) { stream->handled = 0; ngx_queue_remove(&stream->queue); } if (stream->queued == 0) { return; } delta = 0; sc = stream->connection; fn = &sc->last_out; for (;;) { frame = *fn; if (frame == NULL) { break; } if (frame->stream == stream && !frame->blocked) { *fn = frame->next; delta += frame->length; if (--stream->queued == 0) { break; } continue; } fn = &frame->next; } if (sc->send_window == 0 && delta && !ngx_queue_empty(&sc->waiting)) { ngx_queue_add(&sc->posted, &sc->waiting); ngx_queue_init(&sc->waiting); } sc->send_window += delta; }