|
|
|
@ -82,8 +82,7 @@ class ServerCallbackCall { |
|
|
|
|
// Fast version called with known reactor passed in, used from derived
|
|
|
|
|
// classes, typically in non-cancel case
|
|
|
|
|
void MaybeCallOnCancel(ServerReactor* reactor) { |
|
|
|
|
if (GPR_UNLIKELY(on_cancel_conditions_remaining_.fetch_sub( |
|
|
|
|
1, std::memory_order_acq_rel) == 1)) { |
|
|
|
|
if (GPR_UNLIKELY(UnblockCancellation())) { |
|
|
|
|
CallOnCancel(reactor); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -92,7 +91,11 @@ class ServerCallbackCall { |
|
|
|
|
// (such as the ServerContext CompletionOp which is formed before the
|
|
|
|
|
// reactor). This is used in cancel cases only, so it's ok to be slower and
|
|
|
|
|
// invoke a virtual function.
|
|
|
|
|
void MaybeCallOnCancel() { MaybeCallOnCancel(reactor()); } |
|
|
|
|
void MaybeCallOnCancel() { |
|
|
|
|
if (GPR_UNLIKELY(UnblockCancellation())) { |
|
|
|
|
CallOnCancel(reactor()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
/// Increases the reference count
|
|
|
|
@ -111,6 +114,12 @@ class ServerCallbackCall { |
|
|
|
|
// it to an executor.
|
|
|
|
|
void CallOnCancel(ServerReactor* reactor); |
|
|
|
|
|
|
|
|
|
// Implement the cancellation constraint counter. Return true if OnCancel
|
|
|
|
|
// should be called, false otherwise.
|
|
|
|
|
bool UnblockCancellation() { |
|
|
|
|
return on_cancel_conditions_remaining_.fetch_sub( |
|
|
|
|
1, std::memory_order_acq_rel) == 1; } |
|
|
|
|
|
|
|
|
|
std::atomic_int on_cancel_conditions_remaining_{2}; |
|
|
|
|
std::atomic_int callbacks_outstanding_{ |
|
|
|
|
3}; // reserve for start, Finish, and CompletionOp
|
|
|
|
|