It's possible for the first context to be constructed concurrently to
the first set_pollent call. Use an atomic to remove the race.
pull/29140/head
Craig Tiller 3 years ago committed by GitHub
parent 1f03bbab39
commit 91eff1bbba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      src/core/lib/channel/promise_based_filter.h

@ -89,7 +89,10 @@ class BaseCallData : public Activity, private Wakeable {
deadline_(args->deadline),
context_(args->context) {}
void set_pollent(grpc_polling_entity* pollent) { pollent_ = pollent; }
void set_pollent(grpc_polling_entity* pollent) {
GPR_ASSERT(nullptr ==
pollent_.exchange(pollent, std::memory_order_release));
}
// Activity implementation (partial).
void Orphan() final;
@ -111,7 +114,8 @@ class BaseCallData : public Activity, private Wakeable {
: promise_detail::Context<Arena>(call_data->arena_),
promise_detail::Context<grpc_call_context_element>(
call_data->context_),
promise_detail::Context<grpc_polling_entity>(call_data->pollent_),
promise_detail::Context<grpc_polling_entity>(
call_data->pollent_.load(std::memory_order_acquire)),
promise_detail::Context<CallFinalization>(&call_data->finalization_) {
}
};
@ -145,7 +149,7 @@ class BaseCallData : public Activity, private Wakeable {
const Timestamp deadline_;
CallFinalization finalization_;
grpc_call_context_element* const context_;
grpc_polling_entity* pollent_ = nullptr;
std::atomic<grpc_polling_entity*> pollent_{nullptr};
};
class ClientCallData : public BaseCallData {

Loading…
Cancel
Save