Fix bug causing calls to never complete

pull/6160/head
Craig Tiller 9 years ago
parent d78ca88da1
commit 8a67780fba
  1. 20
      src/core/lib/surface/call.c
  2. 2
      test/core/end2end/fuzzers/api_fuzzer.c
  3. 3
      test/core/surface/channel_create_test.c

@ -220,10 +220,7 @@ struct grpc_call {
} server;
} final_op;
struct {
void *bctlp;
bool success;
} saved_receiving_stream_ready_ctx;
void *saved_receiving_stream_ready_bctlp;
};
#define CALL_STACK_FROM_CALL(call) ((grpc_call_stack *)((call) + 1))
@ -1065,12 +1062,11 @@ static void receiving_stream_ready(grpc_exec_ctx *exec_ctx, void *bctlp,
grpc_call *call = bctl->call;
gpr_mu_lock(&bctl->call->mu);
if (bctl->call->has_initial_md_been_received) {
if (bctl->call->has_initial_md_been_received || !success) {
gpr_mu_unlock(&bctl->call->mu);
process_data_after_md(exec_ctx, bctlp, success);
} else {
call->saved_receiving_stream_ready_ctx.bctlp = bctlp;
call->saved_receiving_stream_ready_ctx.success = success;
call->saved_receiving_stream_ready_bctlp = bctlp;
gpr_mu_unlock(&bctl->call->mu);
}
}
@ -1099,13 +1095,11 @@ static void receiving_initial_metadata_ready(grpc_exec_ctx *exec_ctx,
}
call->has_initial_md_been_received = true;
if (call->saved_receiving_stream_ready_ctx.bctlp != NULL) {
if (call->saved_receiving_stream_ready_bctlp != NULL) {
grpc_closure *saved_rsr_closure = grpc_closure_create(
receiving_stream_ready, call->saved_receiving_stream_ready_ctx.bctlp);
grpc_exec_ctx_enqueue(
exec_ctx, saved_rsr_closure,
call->saved_receiving_stream_ready_ctx.success && success, NULL);
call->saved_receiving_stream_ready_ctx.bctlp = NULL;
receiving_stream_ready, call->saved_receiving_stream_ready_bctlp);
call->saved_receiving_stream_ready_bctlp = NULL;
grpc_exec_ctx_enqueue(exec_ctx, saved_rsr_closure, success, NULL);
}
gpr_mu_unlock(&call->mu);

@ -50,7 +50,7 @@
////////////////////////////////////////////////////////////////////////////////
// logging
static const bool squelch = true;
static const bool squelch = !true;
static void dont_log(gpr_log_func_args *args) {}

@ -43,7 +43,8 @@ void test_unknown_scheme_target(void) {
grpc_resolver_registry_init("");
chan = grpc_insecure_channel_create("blah://blah", NULL, NULL);
GPR_ASSERT(chan == NULL);
GPR_ASSERT(chan != NULL);
grpc_channel_destroy(chan);
}
int main(int argc, char **argv) {

Loading…
Cancel
Save