aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/transport/chttp2_transport.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-12-14 21:51:38 -0800
committerGravatar Craig Tiller <ctiller@google.com>2015-12-14 21:51:38 -0800
commit1a423eff872a8a576f168bc564f9c567f292b0aa (patch)
tree49cc884bc64c083a5217a02679de93c256b6fcfa /src/core/transport/chttp2_transport.c
parentb54a9ccd28ff82dd91d98ac842943549615155b4 (diff)
parentc10d68d27beaa0935918d0819cd776b98f7b8300 (diff)
Merge branch 'proxy-crash' into server_stall
Diffstat (limited to 'src/core/transport/chttp2_transport.c')
-rw-r--r--src/core/transport/chttp2_transport.c51
1 files changed, 16 insertions, 35 deletions
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index a5bb7018e3..015c156d94 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -115,11 +115,6 @@ static void close_from_api(grpc_exec_ctx *exec_ctx,
grpc_status_code status,
gpr_slice *optional_message);
-/** Fail any outstanding ops: must be called under lock, whilst not parsing */
-static void fail_all_outstanding_ops(
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
- grpc_chttp2_stream_global *stream_global);
-
/** Add endpoint from this transport to pollset */
static void add_to_pollset_locked(grpc_exec_ctx *exec_ctx,
grpc_chttp2_transport *t,
@@ -753,33 +748,6 @@ void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx,
*pclosure = NULL;
}
-static void fail_all_outstanding_ops(
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
- grpc_chttp2_stream_global *stream_global) {
- grpc_chttp2_stream_parsing *stream_parsing;
- GPR_ASSERT(!TRANSPORT_FROM_GLOBAL(transport_global)->parsing_active);
- stream_parsing = &STREAM_FROM_GLOBAL(stream_global)->parsing;
- grpc_chttp2_complete_closure_step(
- exec_ctx, &stream_global->send_initial_metadata_finished, 0);
- grpc_chttp2_complete_closure_step(
- exec_ctx, &stream_global->send_trailing_metadata_finished, 0);
- grpc_chttp2_complete_closure_step(exec_ctx,
- &stream_global->send_message_finished, 0);
- grpc_chttp2_complete_closure_step(
- exec_ctx, &stream_global->recv_initial_metadata_finished, 0);
- grpc_chttp2_complete_closure_step(
- exec_ctx, &stream_global->recv_trailing_metadata_finished, 0);
- if (stream_global->recv_message_ready != NULL) {
- grpc_exec_ctx_enqueue(exec_ctx, stream_global->recv_message_ready, 0);
- stream_global->recv_message_ready = 0;
- }
- if (stream_parsing->data_parser.parsing_frame != NULL) {
- grpc_chttp2_incoming_byte_stream_finished(
- exec_ctx, stream_parsing->data_parser.parsing_frame, 0, 0);
- stream_parsing->data_parser.parsing_frame = NULL;
- }
-}
-
static int contains_non_ok_status(
grpc_chttp2_transport_global *transport_global,
grpc_metadata_batch *batch) {
@@ -1054,9 +1022,6 @@ static void check_read_ops(grpc_exec_ctx *exec_ctx,
exec_ctx, &stream_global->recv_trailing_metadata_finished, 1);
}
}
- if (stream_global->finished_close) {
- fail_all_outstanding_ops(exec_ctx, transport_global, stream_global);
- }
}
}
@@ -1075,6 +1040,16 @@ static void remove_stream(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
t->parsing.incoming_stream = NULL;
grpc_chttp2_parsing_become_skip_parser(exec_ctx, &t->parsing);
}
+ if (s->global.recv_message_ready != NULL) {
+ grpc_exec_ctx_enqueue(exec_ctx, s->global.recv_message_ready, 0);
+ s->global.recv_message_ready = 0;
+ }
+ if (s->parsing.data_parser.parsing_frame != NULL) {
+ grpc_chttp2_incoming_byte_stream_finished(
+ exec_ctx, s->parsing.data_parser.parsing_frame, 0, 0);
+ s->parsing.data_parser.parsing_frame = NULL;
+ }
+
if (grpc_chttp2_unregister_stream(t, s) && t->global.sent_goaway) {
close_transport_locked(exec_ctx, t);
}
@@ -1158,6 +1133,12 @@ void grpc_chttp2_mark_stream_closed(
}
if (close_writes && !stream_global->write_closed) {
stream_global->write_closed = 1;
+ grpc_chttp2_complete_closure_step(
+ exec_ctx, &stream_global->send_initial_metadata_finished, 0);
+ grpc_chttp2_complete_closure_step(
+ exec_ctx, &stream_global->send_trailing_metadata_finished, 0);
+ grpc_chttp2_complete_closure_step(exec_ctx,
+ &stream_global->send_message_finished, 0);
}
if (stream_global->read_closed && stream_global->write_closed) {
if (stream_global->id != 0 &&