From 379d2326939ff2d1bb26ef5f17047d3c4ca94a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 28 May 2018 22:15:00 +0200 Subject: [PATCH] net80211: fix ieee80211_node_dectestref(). * sync with FreeBSD. * implement atomic_cmpset_int() with atomic_test_and_set(). --- src/libs/compat/freebsd11_network/compat/machine/atomic.h | 3 +++ src/libs/compat/freebsd_network/compat/machine/atomic.h | 4 ++++ src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.cpp | 6 +++--- 3 files changed, 10 insertions(+), 3 deletions(-) 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); }