As the relaxed memory ordering doesn't ensure any memory
synchronization, it is possible that the increment will succeed even
in the case when it should not - there is a race between
atomic_fetch_sub(..., acq_rel) and atomic_fetch_add(..., relaxed).
Only the result is consistent, but the previous value for both calls
could be same when both calls are executed at the same time.
#define isc_refcount_increment0(target) \
({ \
uint_fast32_t __v; \
- __v = atomic_fetch_add_relaxed(target, 1); \
+ __v = atomic_fetch_add_release(target, 1); \
INSIST(__v < UINT32_MAX); \
__v; \
})
#define isc_refcount_increment(target) \
({ \
uint_fast32_t __v; \
- __v = atomic_fetch_add_relaxed(target, 1); \
+ __v = atomic_fetch_add_release(target, 1); \
INSIST(__v > 0 && __v < UINT32_MAX); \
__v; \
})