summaryrefslogtreecommitdiff
path: root/src/pkg/net/sock.go
diff options
context:
space:
mode:
authorDevon H. O'Dell <devon.odell@gmail.com>2009-12-01 23:28:57 -0800
committerDevon H. O'Dell <devon.odell@gmail.com>2009-12-01 23:28:57 -0800
commit973d7ce551fafd0d5144cc5c4ada7826ca42275b (patch)
tree3d428a64096c45ce29301e4ecc1ce7795638d9b3 /src/pkg/net/sock.go
parent31c8897d027204d54377e19337a7af3f1c73e5c6 (diff)
downloadgolang-973d7ce551fafd0d5144cc5c4ada7826ca42275b.tar.gz
net: fix netFD.Close races
Fixes issue 271. Fixes issue 321. R=rsc, agl, cw CC=golang-dev http://codereview.appspot.com/163052 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/net/sock.go')
-rw-r--r--src/pkg/net/sock.go24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/pkg/net/sock.go b/src/pkg/net/sock.go
index c670aa21e..336c96866 100644
--- a/src/pkg/net/sock.go
+++ b/src/pkg/net/sock.go
@@ -75,11 +75,15 @@ func setsockoptNsec(fd, level, opt int, nsec int64) os.Error {
}
func setReadBuffer(fd *netFD, bytes int) os.Error {
- return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes)
+ fd.incref();
+ defer fd.decref();
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes);
}
func setWriteBuffer(fd *netFD, bytes int) os.Error {
- return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes)
+ fd.incref();
+ defer fd.decref();
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes);
}
func setReadTimeout(fd *netFD, nsec int64) os.Error {
@@ -100,7 +104,9 @@ func setTimeout(fd *netFD, nsec int64) os.Error {
}
func setReuseAddr(fd *netFD, reuse bool) os.Error {
- return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse))
+ fd.incref();
+ defer fd.decref();
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, boolint(reuse));
}
func bindToDevice(fd *netFD, dev string) os.Error {
@@ -109,11 +115,15 @@ func bindToDevice(fd *netFD, dev string) os.Error {
}
func setDontRoute(fd *netFD, dontroute bool) os.Error {
- return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute))
+ fd.incref();
+ defer fd.decref();
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, boolint(dontroute));
}
func setKeepAlive(fd *netFD, keepalive bool) os.Error {
- return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive))
+ fd.incref();
+ defer fd.decref();
+ return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive));
}
func setLinger(fd *netFD, sec int) os.Error {
@@ -125,7 +135,9 @@ func setLinger(fd *netFD, sec int) os.Error {
l.Onoff = 0;
l.Linger = 0;
}
- e := syscall.SetsockoptLinger(fd.fd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l);
+ fd.incref();
+ defer fd.decref();
+ e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l);
return os.NewSyscallError("setsockopt", e);
}