diff options
author | Craig Tiller <ctiller@google.com> | 2015-12-14 21:51:38 -0800 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2015-12-14 21:51:38 -0800 |
commit | 1a423eff872a8a576f168bc564f9c567f292b0aa (patch) | |
tree | 49cc884bc64c083a5217a02679de93c256b6fcfa /src/core/transport/chttp2_transport.c | |
parent | b54a9ccd28ff82dd91d98ac842943549615155b4 (diff) | |
parent | c10d68d27beaa0935918d0819cd776b98f7b8300 (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.c | 51 |
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 && |