summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2003-10-03 18:27:02 +0000
committersam <sam@FreeBSD.org>2003-10-03 18:27:02 +0000
commit55a6ca8b62ac8960225695ad65471b41deb2b759 (patch)
tree60d60a0089beb8c88a20957db25af8cd4f135a09 /sys/net/rtsock.c
parent2eee80dc38ec87a007e98d817061d601e30f89bc (diff)
downloadFreeBSD-src-55a6ca8b62ac8960225695ad65471b41deb2b759.zip
FreeBSD-src-55a6ca8b62ac8960225695ad65471b41deb2b759.tar.gz
trivial locking rtsock_cb
Sponsored by: FreeBSD Foundation
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 5d7d526..4af77ec 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);
OpenPOWER on IntegriCloud