net80211: fix ieee80211_node_dectestref().

* sync with FreeBSD.
* implement atomic_cmpset_int() with atomic_test_and_set().
This commit is contained in:
Jérôme Duval
2018-05-31 19:19:50 +00:00
parent 499712a9ec
commit 379d232693
3 changed files with 10 additions and 3 deletions
@@ -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()
@@ -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_ */
@@ -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);
}