summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/http/v2/ngx_http_v2.c27
-rw-r--r--src/http/v2/ngx_http_v2.h3
-rw-r--r--src/http/v2/ngx_http_v2_filter_module.c50
3 files changed, 42 insertions, 38 deletions
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index 485f735d9..b9ebcd8ce 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -286,7 +286,6 @@ ngx_http_v2_init(ngx_event_t *rev)
: ngx_http_v2_state_preface;
ngx_queue_init(&h2c->waiting);
- ngx_queue_init(&h2c->posted);
ngx_queue_init(&h2c->dependencies);
ngx_queue_init(&h2c->closed);
@@ -420,9 +419,7 @@ static void
ngx_http_v2_write_handler(ngx_event_t *wev)
{
ngx_int_t rc;
- ngx_queue_t *q;
ngx_connection_t *c;
- ngx_http_v2_stream_t *stream;
ngx_http_v2_connection_t *h2c;
c = wev->data;
@@ -457,26 +454,6 @@ ngx_http_v2_write_handler(ngx_event_t *wev)
return;
}
- while (!ngx_queue_empty(&h2c->posted)) {
- q = ngx_queue_head(&h2c->posted);
-
- ngx_queue_remove(q);
-
- stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
-
- stream->handled = 0;
-
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
- "run http2 stream %ui", stream->node->id);
-
- wev = stream->request->connection->write;
-
- wev->active = 0;
- wev->ready = 1;
-
- wev->handler(wev);
- }
-
h2c->blocked = 0;
if (rc == NGX_AGAIN) {
@@ -2254,7 +2231,7 @@ ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, u_char *pos,
stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
- stream->handled = 0;
+ stream->waiting = 0;
wev = stream->request->connection->write;
@@ -4274,7 +4251,7 @@ ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,
continue;
}
- stream->handled = 0;
+ stream->waiting = 0;
r = stream->request;
fc = r->connection;
diff --git a/src/http/v2/ngx_http_v2.h b/src/http/v2/ngx_http_v2.h
index 63bbdad54..cddfccd28 100644
--- a/src/http/v2/ngx_http_v2.h
+++ b/src/http/v2/ngx_http_v2.h
@@ -137,7 +137,6 @@ struct ngx_http_v2_connection_s {
ngx_http_v2_out_frame_t *last_out;
- ngx_queue_t posted;
ngx_queue_t dependencies;
ngx_queue_t closed;
@@ -192,7 +191,7 @@ struct ngx_http_v2_stream_s {
ngx_pool_t *pool;
- unsigned handled:1;
+ unsigned waiting:1;
unsigned blocked:1;
unsigned exhausted:1;
unsigned in_closed:1;
diff --git a/src/http/v2/ngx_http_v2_filter_module.c b/src/http/v2/ngx_http_v2_filter_module.c
index 878020e5a..8abca4dd2 100644
--- a/src/http/v2/ngx_http_v2_filter_module.c
+++ b/src/http/v2/ngx_http_v2_filter_module.c
@@ -1104,11 +1104,11 @@ ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c,
ngx_queue_t *q;
ngx_http_v2_stream_t *s;
- if (stream->handled) {
+ if (stream->waiting) {
return;
}
- stream->handled = 1;
+ stream->waiting = 1;
for (q = ngx_queue_last(&h2c->waiting);
q != ngx_queue_sentinel(&h2c->waiting);
@@ -1298,20 +1298,29 @@ static ngx_inline void
ngx_http_v2_handle_stream(ngx_http_v2_connection_t *h2c,
ngx_http_v2_stream_t *stream)
{
+ ngx_event_t *wev;
ngx_connection_t *fc;
- if (stream->handled || stream->blocked) {
+ if (stream->waiting || stream->blocked) {
return;
}
fc = stream->request->connection;
- if (!fc->error && (stream->exhausted || fc->write->delayed)) {
+ if (!fc->error && stream->exhausted) {
return;
}
- stream->handled = 1;
- ngx_queue_insert_tail(&h2c->posted, &stream->queue);
+ wev = fc->write;
+
+ wev->active = 0;
+ wev->ready = 1;
+
+ if (!fc->error && wev->delayed) {
+ return;
+ }
+
+ ngx_post_event(wev, &ngx_posted_events);
}
@@ -1321,11 +1330,13 @@ ngx_http_v2_filter_cleanup(void *data)
ngx_http_v2_stream_t *stream = data;
size_t window;
+ ngx_event_t *wev;
+ ngx_queue_t *q;
ngx_http_v2_out_frame_t *frame, **fn;
ngx_http_v2_connection_t *h2c;
- if (stream->handled) {
- stream->handled = 0;
+ if (stream->waiting) {
+ stream->waiting = 0;
ngx_queue_remove(&stream->queue);
}
@@ -1359,9 +1370,26 @@ ngx_http_v2_filter_cleanup(void *data)
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);
+ if (h2c->send_window == 0 && window) {
+
+ while (!ngx_queue_empty(&h2c->waiting)) {
+ q = ngx_queue_head(&h2c->waiting);
+
+ ngx_queue_remove(q);
+
+ stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue);
+
+ stream->waiting = 0;
+
+ wev = stream->request->connection->write;
+
+ wev->active = 0;
+ wev->ready = 1;
+
+ if (!wev->delayed) {
+ ngx_post_event(wev, &ngx_posted_events);
+ }
+ }
}
h2c->send_window += window;