diff options
author | mav <mav@FreeBSD.org> | 2008-03-30 00:27:48 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2008-03-30 00:27:48 +0000 |
commit | 3847b38de2eb8d014cd365c681e58bd563b90819 (patch) | |
tree | 2c536754d1b847e6e59d2720060cad1da956bdaf | |
parent | ef1b5135a944eaca4ee229eb22b7fda38043f8c5 (diff) | |
download | FreeBSD-src-3847b38de2eb8d014cd365c681e58bd563b90819.zip FreeBSD-src-3847b38de2eb8d014cd365c681e58bd563b90819.tar.gz |
Use new atomic_fetchadd() primitive instead of looping atomic_cmpset().
-rw-r--r-- | sys/netgraph/ng_base.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 588f3d2..f9169ce 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -770,11 +770,9 @@ ng_unref_node(node_p node) return (0); } - do { - v = node->nd_refs - 1; - } while (! atomic_cmpset_int(&node->nd_refs, v + 1, v)); + v = atomic_fetchadd_int(&node->nd_refs, -1); - if (v == 0) { /* we were the last */ + if (v == 1) { /* we were the last */ mtx_lock(&ng_namehash_mtx); node->nd_type->refs--; /* XXX maybe should get types lock? */ @@ -788,7 +786,7 @@ ng_unref_node(node_p node) mtx_destroy(&node->nd_input_queue.q_mtx); NG_FREE_NODE(node); } - return (v); + return (v - 1); } /************************************************************************ @@ -959,9 +957,8 @@ ng_unref_hook(hook_p hook) if (hook == &ng_deadhook) { return; } - do { - v = hook->hk_refs; - } while (! atomic_cmpset_int(&hook->hk_refs, v, v - 1)); + + v = atomic_fetchadd_int(&hook->hk_refs, -1); if (v == 1) { /* we were the last */ if (_NG_HOOK_NODE(hook)) /* it'll probably be ng_deadnode */ |