|
|
|
@ -41,17 +41,21 @@ namespace grpc_core { |
|
|
|
|
enum MemoryOrderRelaxed { memory_order_relaxed }; |
|
|
|
|
|
|
|
|
|
template <class T> |
|
|
|
|
class atomic { |
|
|
|
|
class atomic; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
class atomic<bool> { |
|
|
|
|
public: |
|
|
|
|
static_assert(sizeof(T) <= sizeof(gpr_atm), |
|
|
|
|
"Atomics of size > sizeof(gpr_atm) are not supported"); |
|
|
|
|
atomic() { gpr_atm_no_barrier_store(&x_, static_cast<gpr_atm>(T())); } |
|
|
|
|
atomic() { gpr_atm_no_barrier_store(&x_, static_cast<gpr_atm>(false)); } |
|
|
|
|
explicit atomic(bool x) { |
|
|
|
|
gpr_atm_no_barrier_store(&x_, static_cast<gpr_atm>(x)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool compare_exchange_strong(T& expected, T update, MemoryOrderRelaxed, |
|
|
|
|
bool compare_exchange_strong(bool& expected, bool update, MemoryOrderRelaxed, |
|
|
|
|
MemoryOrderRelaxed) { |
|
|
|
|
if (!gpr_atm_no_barrier_cas(&x_, static_cast<gpr_atm>(expected), |
|
|
|
|
static_cast<gpr_atm>(update))) { |
|
|
|
|
expected = static_cast<T>(gpr_atm_no_barrier_load(&x_)); |
|
|
|
|
expected = gpr_atm_no_barrier_load(&x_) != 0; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|