diff options
author | Sam Leffler <sam@FreeBSD.org> | 2003-10-03 18:27:02 +0000 |
---|---|---|
committer | Sam Leffler <sam@FreeBSD.org> | 2003-10-03 18:27:02 +0000 |
commit | aea8b30f12f5005bae5723fbbcaa606f4a0ac486 (patch) | |
tree | 60d60a0089beb8c88a20957db25af8cd4f135a09 /sys/net/rtsock.c | |
parent | 91c1935fe571476b48b5796f59254bf779105504 (diff) |
Notes
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r-- | sys/net/rtsock.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 5d7d526967fd..4af77ecf4cfe 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -66,6 +66,13 @@ static struct { int any_count; /* total attached */ } route_cb; +struct mtx rtsock_mtx; +MTX_SYSINIT(rtsock, &rtsock_mtx, "rtsock route_cb lock", MTX_DEF); + +#define RTSOCK_LOCK() mtx_lock(&rtsock_mtx) +#define RTSOCK_UNLOCK() mtx_unlock(&rtsock_mtx) +#define RTSOCK_LOCK_ASSERT() mtx_assert(&rtsock_mtx, MA_OWNED) + struct walkarg { int w_tmemsize; int w_op, w_arg; @@ -128,6 +135,7 @@ rts_attach(struct socket *so, int proto, struct thread *td) free(rp, M_PCB); return error; } + RTSOCK_LOCK(); switch(rp->rcb_proto.sp_protocol) { case AF_INET: route_cb.ip_count++; @@ -141,6 +149,7 @@ rts_attach(struct socket *so, int proto, struct thread *td) } rp->rcb_faddr = &route_src; route_cb.any_count++; + RTSOCK_UNLOCK(); soisconnected(so); so->so_options |= SO_USELOOPBACK; splx(s); @@ -178,6 +187,7 @@ rts_detach(struct socket *so) s = splnet(); if (rp != 0) { + RTSOCK_LOCK(); switch(rp->rcb_proto.sp_protocol) { case AF_INET: route_cb.ip_count--; @@ -190,6 +200,7 @@ rts_detach(struct socket *so) break; } route_cb.any_count--; + RTSOCK_UNLOCK(); } error = raw_usrreqs.pru_detach(so); splx(s); |