diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/surface/call.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 556a3b600e..c6fc56891d 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -302,6 +302,10 @@ grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, call->receiving = 1; grpc_call_internal_ref(call); initial_op_ptr = &initial_op; + } else { + /* we clear this when we've sent initial metadata -- this is very much + a hack to avoid two ops ending up in client_channel */ + call->receiving = 2; } grpc_call_stack_init(channel_stack, server_transport_data, initial_op_ptr, CALL_STACK_FROM_CALL(call)); @@ -595,6 +599,10 @@ static void call_on_done_send(void *pc, int success) { lock(call); if (call->last_send_contains & (1 << GRPC_IOREQ_SEND_INITIAL_METADATA)) { finish_ioreq_op(call, GRPC_IOREQ_SEND_INITIAL_METADATA, error); + if (call->is_client) { + GPR_ASSERT(call->receiving == 2); + call->receiving = 0; + } } if (call->last_send_contains & (1 << GRPC_IOREQ_SEND_MESSAGE)) { finish_ioreq_op(call, GRPC_IOREQ_SEND_MESSAGE, error); @@ -604,6 +612,7 @@ static void call_on_done_send(void *pc, int success) { finish_ioreq_op(call, GRPC_IOREQ_SEND_STATUS, error); finish_ioreq_op(call, GRPC_IOREQ_SEND_CLOSE, error); } + call->last_send_contains = 0; call->sending = 0; unlock(call); grpc_call_internal_unref(call, 0); |