hrev51985 adds 1 changeset to branch 'master'
old head: 499712a9ec196b59c1112cf45feba6d55bef69e2
new head: 379d2326939ff2d1bb26ef5f17047d3c4ca94a62
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=379d2326939f+%5E499712a9ec19
----------------------------------------------------------------------------
379d2326939f: net80211: fix ieee80211_node_dectestref().
* sync with FreeBSD.
* implement atomic_cmpset_int() with atomic_test_and_set().
[ Jérôme Duval <jerome.duval@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev51985
Commit: 379d2326939ff2d1bb26ef5f17047d3c4ca94a62
URL: https://git.haiku-os.org/haiku/commit/?id=379d2326939f
Author: Jérôme Duval <jerome.duval@xxxxxxxxx>
Date: Mon May 28 20:15:00 2018 UTC
----------------------------------------------------------------------------
3 files changed, 10 insertions(+), 3 deletions(-)
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 +++---
----------------------------------------------------------------------------
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);
}