diff options
author | Craig Tiller <ctiller@google.com> | 2015-05-05 08:44:47 -0700 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2015-05-05 08:44:47 -0700 |
commit | 5fdcbb7fbebe6efd353494a8f316216f13f7cf13 (patch) | |
tree | 50ca95b4a61bf94954e1c1db0f138cc29b47487a /src/core/surface | |
parent | 8e7fe9b9f01f88e322b97bdd5ed399395e563cde (diff) | |
parent | d53d87cbd3a93fa90ac1363fd5dc3b27dbb31cae (diff) |
Merge github.com:grpc/grpc into bye-bye-completion-queue-pie
Diffstat (limited to 'src/core/surface')
-rw-r--r-- | src/core/surface/call.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 3b8d514b4f..5fdb5bf7e4 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -246,6 +246,9 @@ static int fill_send_ops(grpc_call *call, grpc_transport_op *op); static void execute_op(grpc_call *call, grpc_transport_op *op); static void recv_metadata(grpc_call *call, grpc_metadata_batch *metadata); static void finish_read_ops(grpc_call *call); +static grpc_call_error cancel_with_status( + grpc_call *c, grpc_status_code status, const char *description, + gpr_uint8 locked); grpc_call *grpc_call_create(grpc_channel *channel, grpc_completion_queue *cq, const void *server_transport_data, @@ -625,7 +628,7 @@ static int begin_message(grpc_call *call, grpc_begin_message msg) { gpr_asprintf( &message, "Message terminated early; read %d bytes, expected %d", (int)call->incoming_message.length, (int)call->incoming_message_length); - grpc_call_cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message); + cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message, 1); gpr_free(message); return 0; } @@ -636,7 +639,7 @@ static int begin_message(grpc_call *call, grpc_begin_message msg) { &message, "Maximum message length of %d exceeded by a message of length %d", grpc_channel_get_max_message_length(call->channel), msg.length); - grpc_call_cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message); + cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message, 1); gpr_free(message); return 0; } else if (msg.length > 0) { @@ -656,9 +659,9 @@ static int add_slice_to_message(grpc_call *call, gpr_slice slice) { } /* we have to be reading a message to know what to do here */ if (!call->reading_message) { - grpc_call_cancel_with_status( + cancel_with_status( call, GRPC_STATUS_INVALID_ARGUMENT, - "Received payload data while not reading a message"); + "Received payload data while not reading a message", 1); return 0; } /* append the slice to the incoming buffer */ @@ -669,7 +672,7 @@ static int add_slice_to_message(grpc_call *call, gpr_slice slice) { gpr_asprintf( &message, "Receiving message overflow; read %d bytes, expected %d", (int)call->incoming_message.length, (int)call->incoming_message_length); - grpc_call_cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message); + cancel_with_status(call, GRPC_STATUS_INVALID_ARGUMENT, message, 1); gpr_free(message); return 0; } else if (call->incoming_message.length == call->incoming_message_length) { @@ -683,7 +686,7 @@ static int add_slice_to_message(grpc_call *call, gpr_slice slice) { static void call_on_done_recv(void *pc, int success) { grpc_call *call = pc; size_t i; - GRPC_TIMER_MARK(CALL_ON_DONE_RECV_BEGIN, 0); + GRPC_TIMER_BEGIN(GRPC_PTAG_CALL_ON_DONE_RECV, 0); lock(call); call->receiving = 0; if (success) { @@ -728,7 +731,7 @@ static void call_on_done_recv(void *pc, int success) { unlock(call); GRPC_CALL_INTERNAL_UNREF(call, "receiving", 0); - GRPC_TIMER_MARK(CALL_ON_DONE_RECV_END, 0); + GRPC_TIMER_BEGIN(GRPC_PTAG_CALL_ON_DONE_RECV, 0); } static grpc_mdelem_list chain_metadata_from_app(grpc_call *call, size_t count, @@ -996,6 +999,12 @@ grpc_call_error grpc_call_cancel(grpc_call *call) { grpc_call_error grpc_call_cancel_with_status(grpc_call *c, grpc_status_code status, const char *description) { + return cancel_with_status(c, status, description, 0); +} + +static grpc_call_error cancel_with_status( + grpc_call *c, grpc_status_code status, const char *description, + gpr_uint8 locked) { grpc_transport_op op; grpc_mdstr *details = description ? grpc_mdstr_from_string(c->metadata_context, description) @@ -1003,10 +1012,14 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *c, memset(&op, 0, sizeof(op)); op.cancel_with_status = status; - lock(c); + if (locked == 0) { + lock(c); + } set_status_code(c, STATUS_FROM_API_OVERRIDE, status); set_status_details(c, STATUS_FROM_API_OVERRIDE, details); - unlock(c); + if (locked == 0) { + unlock(c); + } execute_op(c, &op); @@ -1027,8 +1040,8 @@ static void call_alarm(void *arg, int success) { grpc_call *call = arg; if (success) { if (call->is_client) { - grpc_call_cancel_with_status(call, GRPC_STATUS_DEADLINE_EXCEEDED, - "Deadline Exceeded"); + cancel_with_status(call, GRPC_STATUS_DEADLINE_EXCEEDED, + "Deadline Exceeded", 0); } else { grpc_call_cancel(call); } |