net80211: fix ieee80211_node_dectestref().
* sync with FreeBSD. * implement atomic_cmpset_int() with atomic_test_and_set().
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user