aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-05-05 08:44:47 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-05-05 08:44:47 -0700
commit5fdcbb7fbebe6efd353494a8f316216f13f7cf13 (patch)
tree50ca95b4a61bf94954e1c1db0f138cc29b47487a /src/core/surface
parent8e7fe9b9f01f88e322b97bdd5ed399395e563cde (diff)
parentd53d87cbd3a93fa90ac1363fd5dc3b27dbb31cae (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.c35
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);
}