[haiku-commits] haiku: hrev51985 - in src/libs/compat: freebsd_wlan/net80211 freebsd_network/compat/machine freebsd11_network/compat/machine

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 31 May 2018 15:19:53 -0400 (EDT)

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);
 }
 
 


Other related posts:

  • » [haiku-commits] haiku: hrev51985 - in src/libs/compat: freebsd_wlan/net80211 freebsd_network/compat/machine freebsd11_network/compat/machine - Jérôme Duval