|
@@ -1148,7 +1148,7 @@ extern "C" {
|
|
|
#define ENET_ATOMIC_READ(variable) enet_at_atomic_read((char *)(variable), ENET_ATOMIC_SIZEOF(variable))
|
|
|
#define ENET_ATOMIC_WRITE(variable, new_val) \
|
|
|
enet_at_atomic_write((char *)(variable), (int64_t)(new_val), ENET_ATOMIC_SIZEOF(variable))
|
|
|
- #define ENET_ATOMIC_CAS(variable, old_value, new_val) \
|
|
|
+ #define ENET_ATOMIC_CAS(variable, old_value, new_val, assign) \
|
|
|
enet_at_atomic_cas((char *)(variable), (int64_t)(new_val), (int64_t)(old_value), \
|
|
|
ENET_ATOMIC_SIZEOF(variable))
|
|
|
#define ENET_ATOMIC_INC(variable) enet_at_atomic_inc((char *)(variable), 1, ENET_ATOMIC_SIZEOF(variable))
|
|
@@ -1185,13 +1185,13 @@ extern "C" {
|
|
|
potentially lost data. Replace the code with the equivalent non-sync code. */
|
|
|
#ifdef __clang_analyzer__
|
|
|
|
|
|
- #define ENET_ATOMIC_CAS(ptr, old_value, new_value) \
|
|
|
+ #define ENET_ATOMIC_CAS(ptr, old_value, new_value, assign) \
|
|
|
({ \
|
|
|
- typeof(*(ptr)) ENET_ATOMIC_CAS_old_actual_ = (*(ptr)); \
|
|
|
+ typeof(*(ptr)) ENET_ATOMIC_CAS_old_actual_ = (*(ptr)); \
|
|
|
if (ATOMIC_CAS_old_actual_ == (old_value)) { \
|
|
|
*(ptr) = new_value; \
|
|
|
} \
|
|
|
- ENET_ATOMIC_CAS_old_actual_; \
|
|
|
+ ENET_ATOMIC_CAS_old_actual_; \
|
|
|
})
|
|
|
|
|
|
#else
|
|
@@ -1202,13 +1202,12 @@ extern "C" {
|
|
|
|
|
|
TODO We should return bool here instead of the old value to avoid the ABA
|
|
|
problem. */
|
|
|
- #define ENET_ATOMIC_CAS(ptr, old_value, new_value) \
|
|
|
- ({ \
|
|
|
- typeof(*(ptr)) ENET_ATOMIC_CAS_expected_ = (old_value); \
|
|
|
- __atomic_compare_exchange_n((ptr), &ENET_ATOMIC_CAS_expected_, (new_value), false, \
|
|
|
- __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE); \
|
|
|
- ENET_ATOMIC_CAS_expected_; \
|
|
|
- })
|
|
|
+ #define ENET_ATOMIC_CAS(ptr, old_value, new_value, assign) \
|
|
|
+ 0; \
|
|
|
+ typeof(*(ptr)) ENET_ATOMIC_CAS_expected_ = (old_value); \
|
|
|
+ __atomic_compare_exchange_n((ptr), &ENET_ATOMIC_CAS_expected_, (new_value), false, \
|
|
|
+ __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE); \
|
|
|
+ assign = ENET_ATOMIC_CAS_expected_;
|
|
|
|
|
|
#endif /* __clang_analyzer__ */
|
|
|
|
|
@@ -1222,7 +1221,7 @@ extern "C" {
|
|
|
#define ENET_ATOMIC_READ(variable) __sync_fetch_and_add(variable, 0)
|
|
|
#define ENET_ATOMIC_WRITE(variable, new_val) \
|
|
|
(void) __sync_val_compare_and_swap((variable), *(variable), (new_val))
|
|
|
- #define ENET_ATOMIC_CAS(variable, old_value, new_val) \
|
|
|
+ #define ENET_ATOMIC_CAS(variable, old_value, new_val, assign) \
|
|
|
__sync_val_compare_and_swap((variable), (old_value), (new_val))
|
|
|
#define ENET_ATOMIC_INC(variable) __sync_fetch_and_add((variable), 1)
|
|
|
#define ENET_ATOMIC_DEC(variable) __sync_fetch_and_sub((variable), 1)
|
|
@@ -5004,7 +5003,7 @@ extern "C" {
|
|
|
// Set the value of the start_time_ns, such that the first timestamp
|
|
|
// is at 1ms. This ensures 0 remains a special value.
|
|
|
uint64_t want_value = current_time_ns - 1 * ns_in_ms;
|
|
|
- uint64_t old_value = ENET_ATOMIC_CAS(&start_time_ns, 0, want_value);
|
|
|
+ uint64_t old_value = ENET_ATOMIC_CAS(&start_time_ns, 0, want_value, old_value);
|
|
|
offset_ns = old_value == 0 ? want_value : old_value;
|
|
|
}
|
|
|
|