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) \
|
#define atomic_readandclear_int(ptr) \
|
||||||
atomic_set((int32 *)(ptr), 0)
|
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 mb() memory_full_barrier()
|
||||||
#define wmb() memory_write_barrier_inline()
|
#define wmb() memory_write_barrier_inline()
|
||||||
|
|||||||
@@ -24,4 +24,8 @@
|
|||||||
#define atomic_readandclear_int(ptr) \
|
#define atomic_readandclear_int(ptr) \
|
||||||
atomic_set((int32 *)(ptr), 0)
|
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_ */
|
#endif /* _FBSD_COMPAT_MACHINE_ATOMIC_H_ */
|
||||||
|
|||||||
@@ -454,7 +454,7 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Decrements the reference-counter and
|
* 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 1 reference-counter became zero
|
||||||
* @return 0 reference-counter didn't became zero
|
* @return 0 reference-counter didn't became zero
|
||||||
@@ -462,8 +462,8 @@ ieee80211_getmgtframe(uint8_t** frm, int headroom, int pktlen)
|
|||||||
int
|
int
|
||||||
ieee80211_node_dectestref(struct ieee80211_node* ni)
|
ieee80211_node_dectestref(struct ieee80211_node* ni)
|
||||||
{
|
{
|
||||||
// atomic_add returns old value
|
atomic_subtract_int(&ni->ni_refcnt, 1);
|
||||||
return atomic_add((int32*)&ni->ni_refcnt, -1) == 1;
|
return atomic_cmpset_int(&ni->ni_refcnt, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user