|
|
|
@ -63,25 +63,31 @@ static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { |
|
|
|
|
/* InterlockedCompareExchangePointerNoFence() not available on vista or
|
|
|
|
|
windows7 */ |
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire64(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire64((volatile LONGLONG *) p, |
|
|
|
|
(LONGLONG) n, (LONGLONG) o); |
|
|
|
|
#else |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *) p, |
|
|
|
|
(LONG) n, (LONG) o); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { |
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire64(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire64((volatile LONGLONG) p, |
|
|
|
|
(LONGLONG) n, (LONGLONG) o); |
|
|
|
|
#else |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *) p, |
|
|
|
|
(LONG) n, (LONG) o); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) { |
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeRelease64(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeRelease64((volatile LONGLONG *) p, |
|
|
|
|
(LONGLONG) n, (LONGLONG) o); |
|
|
|
|
#else |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeRelease(p, n, o); |
|
|
|
|
return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG *) p, |
|
|
|
|
(LONG) n, (LONG) o); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -101,11 +107,15 @@ static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta) { |
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
do { |
|
|
|
|
old = *p; |
|
|
|
|
} while (old != (gpr_atm)InterlockedCompareExchange64(p, old + delta, old)); |
|
|
|
|
} while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG *) p, |
|
|
|
|
(LONGLONG) old + delta, |
|
|
|
|
(LONGLONG) old)); |
|
|
|
|
#else |
|
|
|
|
do { |
|
|
|
|
old = *p; |
|
|
|
|
} while (old != (gpr_atm)InterlockedCompareExchange(p, old + delta, old)); |
|
|
|
|
} while (old != (gpr_atm)InterlockedCompareExchange((volatile LONG *) p, |
|
|
|
|
(LONG) old + delta, |
|
|
|
|
(LONG) old)); |
|
|
|
|
#endif |
|
|
|
|
return old; |
|
|
|
|
} |
|
|
|
|