diff options
author | Russ Cox <rsc@golang.org> | 2010-07-26 16:19:39 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-07-26 16:19:39 -0700 |
commit | 5ee02eef4ce50344ee237821da3a0dbe1463dc1b (patch) | |
tree | 28ef8e54b86f53a07d8a715e6a3d80fb781ac5cc | |
parent | 4188504f38b283a03d40063686eb167db007a2e4 (diff) | |
download | go-5ee02eef4ce50344ee237821da3a0dbe1463dc1b.tar.gz go-5ee02eef4ce50344ee237821da3a0dbe1463dc1b.zip |
net: TCPConn.SetNoDelay, back by popular demand
R=r
CC=golang-dev
https://golang.org/cl/1880047
-rw-r--r-- | src/pkg/net/sock.go | 6 | ||||
-rw-r--r-- | src/pkg/net/tcpsock.go | 13 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/pkg/net/sock.go b/src/pkg/net/sock.go index fbdb695839..d04d4dd7c2 100644 --- a/src/pkg/net/sock.go +++ b/src/pkg/net/sock.go @@ -129,6 +129,12 @@ func setKeepAlive(fd *netFD, keepalive bool) os.Error { return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)) } +func setNoDelay(fd *netFD, noDelay bool) os.Error { + fd.incref() + defer fd.decref() + return setsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)) +} + func setLinger(fd *netFD, sec int) os.Error { var l syscall.Linger if sec >= 0 { diff --git a/src/pkg/net/tcpsock.go b/src/pkg/net/tcpsock.go index d40035291d..7a60cd2e7d 100644 --- a/src/pkg/net/tcpsock.go +++ b/src/pkg/net/tcpsock.go @@ -73,7 +73,7 @@ type TCPConn struct { func newTCPConn(fd *netFD) *TCPConn { c := &TCPConn{fd} - setsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1) + c.SetNoDelay(true) return c } @@ -192,6 +192,17 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error { return setKeepAlive(c.fd, keepalive) } +// SetNoDelay controls whether the operating system should delay +// packet transmission in hopes of sending fewer packets +// (Nagle's algorithm). The default is true (no delay), meaning +// that data is sent as soon as possible after a Write. +func (c *TCPConn) SetNoDelay(noDelay bool) os.Error { + if !c.ok() { + return os.EINVAL + } + return setNoDelay(c.fd, noDelay) +} + // DialTCP is like Dial but can only connect to TCP networks // and returns a TCPConn structure. func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error) { |