diff options
author | David Garcia Quintas <dgq@google.com> | 2017-05-01 12:52:06 -0700 |
---|---|---|
committer | David Garcia Quintas <dgq@google.com> | 2017-05-01 12:52:06 -0700 |
commit | d8e278f3dc293594b6f0b8b9c46abdf643961960 (patch) | |
tree | 308b4b462028b9f91d7b9988bce3831189b78ade /src | |
parent | 04109e8f7dc81a1c9deec5335258d507a41be629 (diff) | |
parent | 6626a86923aaebae86aeeba151c99ed3089d02fc (diff) |
Merge branch 'master' of github.com:grpc/grpc into grpclb_new_test
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ext/filters/http/message_compress/message_compress_filter.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.c b/src/core/ext/filters/http/message_compress/message_compress_filter.c index 4f5f41e9b0..1da8cf69cb 100644 --- a/src/core/ext/filters/http/message_compress/message_compress_filter.c +++ b/src/core/ext/filters/http/message_compress/message_compress_filter.c @@ -277,13 +277,10 @@ static void compress_start_transport_stream_op_batch( GPR_TIMER_BEGIN("compress_start_transport_stream_op_batch", 0); if (op->cancel_stream) { - gpr_atm cur; GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error); - do { - cur = gpr_atm_acq_load(&calld->send_initial_metadata_state); - } while (!gpr_atm_rel_cas( - &calld->send_initial_metadata_state, cur, - CANCELLED_BIT | (gpr_atm)op->payload->cancel_stream.cancel_error)); + gpr_atm cur = gpr_atm_full_xchg( + &calld->send_initial_metadata_state, + CANCELLED_BIT | (gpr_atm)op->payload->cancel_stream.cancel_error); switch (cur) { case HAS_COMPRESSION_ALGORITHM: case NO_COMPRESSION_ALGORITHM: @@ -311,13 +308,18 @@ static void compress_start_transport_stream_op_batch( grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, op, error); return; } - gpr_atm cur = gpr_atm_acq_load(&calld->send_initial_metadata_state); + gpr_atm cur; + retry_send_im: + cur = gpr_atm_acq_load(&calld->send_initial_metadata_state); GPR_ASSERT(cur != HAS_COMPRESSION_ALGORITHM && cur != NO_COMPRESSION_ALGORITHM); if ((cur & CANCELLED_BIT) == 0) { - gpr_atm_rel_store(&calld->send_initial_metadata_state, - has_compression_algorithm ? HAS_COMPRESSION_ALGORITHM - : NO_COMPRESSION_ALGORITHM); + if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur, + has_compression_algorithm + ? HAS_COMPRESSION_ALGORITHM + : NO_COMPRESSION_ALGORITHM)) { + goto retry_send_im; + } if (cur != INITIAL_METADATA_UNSEEN) { grpc_call_next_op(exec_ctx, elem, (grpc_transport_stream_op_batch *)cur); |