- Use refcount(9) API to manage node and hook refcounting.
- Make ng_unref_node() void, since caller shouldn't be interested in whether node is valid after call or not, since it can't be guaranteed to be valid. [1] Ok from: julian [1]
This commit is contained in:
parent
2303570fe8
commit
3fbdf77459
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=223754
@ -53,6 +53,7 @@
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/refcount.h>
|
||||
|
||||
#ifdef HAVE_KERNEL_OPTION_HEADERS
|
||||
#include "opt_netgraph.h"
|
||||
@ -137,7 +138,7 @@ struct ng_hook {
|
||||
* If you can't do it with these you probably shouldn;t be doing it.
|
||||
*/
|
||||
void ng_unref_hook(hook_p hook); /* don't move this */
|
||||
#define _NG_HOOK_REF(hook) atomic_add_int(&(hook)->hk_refs, 1)
|
||||
#define _NG_HOOK_REF(hook) refcount_acquire(&(hook)->hk_refs)
|
||||
#define _NG_HOOK_NAME(hook) ((hook)->hk_name)
|
||||
#define _NG_HOOK_UNREF(hook) ng_unref_hook(hook)
|
||||
#define _NG_HOOK_SET_PRIVATE(hook, val) do {(hook)->hk_private = val;} while (0)
|
||||
@ -396,11 +397,11 @@ struct ng_node {
|
||||
* Public methods for nodes.
|
||||
* If you can't do it with these you probably shouldn't be doing it.
|
||||
*/
|
||||
int ng_unref_node(node_p node); /* don't move this */
|
||||
void ng_unref_node(node_p node); /* don't move this */
|
||||
#define _NG_NODE_NAME(node) ((node)->nd_name + 0)
|
||||
#define _NG_NODE_HAS_NAME(node) ((node)->nd_name[0] + 0)
|
||||
#define _NG_NODE_ID(node) ((node)->nd_ID + 0)
|
||||
#define _NG_NODE_REF(node) atomic_add_int(&(node)->nd_refs, 1)
|
||||
#define _NG_NODE_REF(node) refcount_acquire(&(node)->nd_refs)
|
||||
#define _NG_NODE_UNREF(node) ng_unref_node(node)
|
||||
#define _NG_NODE_SET_PRIVATE(node, val) do {(node)->nd_private = val;} while (0)
|
||||
#define _NG_NODE_PRIVATE(node) ((node)->nd_private)
|
||||
|
@ -772,18 +772,14 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3)
|
||||
* Remove a reference to the node, possibly the last.
|
||||
* deadnode always acts as it it were the last.
|
||||
*/
|
||||
int
|
||||
void
|
||||
ng_unref_node(node_p node)
|
||||
{
|
||||
int v;
|
||||
|
||||
if (node == &ng_deadnode) {
|
||||
return (0);
|
||||
}
|
||||
if (node == &ng_deadnode)
|
||||
return;
|
||||
|
||||
v = atomic_fetchadd_int(&node->nd_refs, -1);
|
||||
|
||||
if (v == 1) { /* we were the last */
|
||||
if (refcount_release(&node->nd_refs)) { /* we were the last */
|
||||
|
||||
mtx_lock(&ng_namehash_mtx);
|
||||
node->nd_type->refs--; /* XXX maybe should get types lock? */
|
||||
@ -797,7 +793,6 @@ ng_unref_node(node_p node)
|
||||
mtx_destroy(&node->nd_input_queue.q_mtx);
|
||||
NG_FREE_NODE(node);
|
||||
}
|
||||
return (v - 1);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -963,15 +958,11 @@ ng_unname(node_p node)
|
||||
void
|
||||
ng_unref_hook(hook_p hook)
|
||||
{
|
||||
int v;
|
||||
|
||||
if (hook == &ng_deadhook) {
|
||||
if (hook == &ng_deadhook)
|
||||
return;
|
||||
}
|
||||
|
||||
v = atomic_fetchadd_int(&hook->hk_refs, -1);
|
||||
|
||||
if (v == 1) { /* we were the last */
|
||||
if (refcount_release(&hook->hk_refs)) { /* we were the last */
|
||||
if (_NG_HOOK_NODE(hook)) /* it'll probably be ng_deadnode */
|
||||
_NG_NODE_UNREF((_NG_HOOK_NODE(hook)));
|
||||
NG_FREE_HOOK(hook);
|
||||
|
Loading…
Reference in New Issue
Block a user