From 87628fd213cbfdff692cb411ac64d4f006a8e6e4 Mon Sep 17 00:00:00 2001 From: julian Date: Sun, 14 Sep 2008 10:22:37 +0000 Subject: come on Julian, make up if you're committing one change or the other. fix braino --- sys/net/route.c | 2 +- sys/net/route.h | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 13 deletions(-) (limited to 'sys/net') diff --git a/sys/net/route.c b/sys/net/route.c index 95c46ca..6bcb591 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1698,7 +1698,7 @@ rt_check(struct rtentry **lrt, struct rtentry **lrt0, struct sockaddr *dst) KASSERT(*lrt0 != NULL, ("rt_check")); rt = rt0 = *lrt0; - fibnum = (*rt0)->rt_fibnum; + fibnum = rt0->rt_fibnum; /* NB: the locking here is tortuous... */ RT_LOCK(rt); diff --git a/sys/net/route.h b/sys/net/route.h index 2c9afb2..249a41e 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -316,20 +316,36 @@ struct rt_addrinfo { } while (0) #define RTFREE_LOCKED(_rt) do { \ - if ((_rt)->rt_refcnt <= 1) \ - rtfree(_rt); \ - else { \ - RT_REMREF(_rt); \ - RT_UNLOCK(_rt); \ - } \ - /* guard against invalid refs */ \ - _rt = 0; \ - } while (0) + if ((_rt)->rt_refcnt <= 1) \ + rtfree(_rt); \ + else { \ + RT_REMREF(_rt); \ + RT_UNLOCK(_rt); \ + } \ + /* guard against invalid refs */ \ + _rt = 0; \ +} while (0) #define RTFREE(_rt) do { \ - RT_LOCK(_rt); \ - RTFREE_LOCKED(_rt); \ - } while (0) + RT_LOCK(_rt); \ + RTFREE_LOCKED(_rt); \ +} while (0) + +#define RT_TEMP_UNLOCK(_rt) do { \ + RT_ADDREF(_rt); \ + RT_UNLOCK(_rt); \ +} while (0) + +#define RT_RELOCK(_rt) do { \ + RT_LOCK(_rt); \ + if ((_rt)->rt_refcnt <= 1) { \ + rtfree(_rt); \ + _rt = 0; /* signal that it went away */ \ + } else { \ + RT_REMREF(_rt); \ + /* note that _rt is still valid */ \ + } \ +} while (0) extern struct radix_node_head *rt_tables[][AF_MAX+1]; -- cgit v1.1