瀏覽代碼

Fix tsan failure

kpayson64 7 年之前
父節點
當前提交
2069bf520f
共有 1 個文件被更改,包括 3 次插入3 次删除
  1. 3 3
      src/core/lib/surface/call.cc

+ 3 - 3
src/core/lib/surface/call.cc

@@ -189,7 +189,7 @@ struct grpc_call {
   grpc_closure receiving_initial_metadata_ready;
   grpc_closure receiving_trailing_metadata_ready;
   uint32_t test_only_last_message_flags;
-  bool cancelled;
+  gpr_atm cancelled;
 
   grpc_closure release_call;
 
@@ -304,6 +304,7 @@ grpc_error* grpc_call_create(const grpc_call_create_args* args,
       gpr_arena_alloc(arena, ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call)) +
                                  channel_stack->call_stack_size));
   gpr_ref_init(&call->ext_ref, 1);
+  gpr_atm_no_barrier_store(&call->cancelled, 0);
   call->arena = arena;
   grpc_call_combiner_init(&call->call_combiner);
   *out_call = call;
@@ -646,11 +647,10 @@ static void done_termination(void* arg, grpc_error* error) {
 }
 
 static void cancel_with_error(grpc_call* c, grpc_error* error) {
-  if (c->cancelled) {
+  if (!gpr_atm_rel_cas(&c->cancelled, 0, 1)) {
     GRPC_ERROR_UNREF(error);
     return;
   }
-  c->cancelled = true;
   GRPC_CALL_INTERNAL_REF(c, "termination");
   // Inform the call combiner of the cancellation, so that it can cancel
   // any in-flight asynchronous actions that may be holding the call