Author: colin Date: 2009-12-30 02:00:51 +0100 (Wed, 30 Dec 2009) New Revision: 34823 Changeset: http://dev.haiku-os.org/changeset/34823/haiku Modified: haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.c Log: Found a better solution for implementing ieee80211_node_dectestref(). Now the reference count get accessed only once, leading to true atomarity. Modified: haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.c =================================================================== --- haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.c 2009-12-30 00:45:16 UTC (rev 34822) +++ haiku/trunk/src/libs/compat/freebsd_wlan/net80211/ieee80211_haiku.c 2009-12-30 01:00:51 UTC (rev 34823) @@ -397,8 +397,6 @@ /* * Decrements the reference-counter and * tests whether it became zero. - * NB: The negation of atomic_add is not atomar. Must work until sth. better is - * found. * * @return 1 reference-counter became zero * @return 0 reference-counter didn't became zero @@ -406,9 +404,8 @@ int ieee80211_node_dectestref(struct ieee80211_node* ni) { - // XXX need equivalent of atomic_dec_and_test - atomic_add((vint32*)&ni->ni_refcnt, -1); - return !atomic_add((vint32*)&ni->ni_refcnt, 0); + // atomic_add returns old value + return 1 == atomic_add((vint32*)&ni->ni_refcnt, -1); }