diff --git a/src/libs/compat/freebsd11_network/compat/machine/atomic.h b/src/libs/compat/freebsd11_network/compat/machine/atomic.h index 14855bbce3..8ee8387755 100644 --- a/src/libs/compat/freebsd11_network/compat/machine/atomic.h +++ b/src/libs/compat/freebsd11_network/compat/machine/atomic.h @@ -24,6 +24,9 @@ #define atomic_readandclear_int(ptr) \ atomic_set((int32 *)(ptr), 0) +#define atomic_cmpset_int(ptr, old, new) \ + (atomic_test_and_set((int32 *)(ptr), new, old) == old) + #define mb() memory_full_barrier() #define wmb() memory_write_barrier_inline() diff --git a/src/libs/compat/freebsd_network/compat/machine/atomic.h b/src/libs/compat/freebsd_network/compat/machine/atomic.h index d02f8ff148..89b3f02d8f 100644 --- a/src/libs/compat/freebsd_network/compat/machine/atomic.h +++ b/src/libs/compat/freebsd_network/compat/machine/atomic.h @@ -24,4 +24,8 @@ #define atomic_readandclear_int(ptr) \ atomic_set((int32 *)(ptr), 0) +#define atomic_cmpset_int(ptr, old, new) \ + (atomic_test_and_set((int32 *)(ptr), new, old) == old) + + #endif /* _FBSD_COMPAT_MACHINE_ATOMIC_H_ */ diff --git a/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.cpp b/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.cpp index e0398ffa5b..54e7ce714b 100644 --- a/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.cpp +++ b/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.cpp @@ -454,7 +454,7 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen) /* * Decrements the reference-counter and - * tests whether it became zero. + * tests whether it became zero. If so, sets it to one. * * @return 1 reference-counter became zero * @return 0 reference-counter didn't became zero @@ -462,8 +462,8 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen) int ieee80211_node_dectestref(struct ieee80211_node* ni) { - // atomic_add returns old value - return atomic_add((int32*)&ni->ni_refcnt, -1) == 1; + atomic_subtract_int(&ni->ni_refcnt, 1); + return atomic_cmpset_int(&ni->ni_refcnt, 0, 1); }