From: Dmitriy Vyukov Date: Thu, 14 Mar 2013 06:32:42 +0000 (+0400) Subject: net: prepare connect() for new network poller X-Git-Tag: go1.1rc2~518 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a11d7d4e11207be9186c6dbeda11fedfef3cbe4d;p=gostls13.git net: prepare connect() for new network poller The problem is that new network poller can have spurious rediness notifications. This implementation ensures that the socket is actually connected. R=golang-dev, rsc, akumar CC=golang-dev https://golang.org/cl/7785043 --- diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go index 5621927dc3..cc5a030acb 100644 --- a/src/pkg/net/fd_unix.go +++ b/src/pkg/net/fd_unix.go @@ -86,21 +86,19 @@ func (fd *netFD) connect(ra syscall.Sockaddr) error { if err := fd.pd.PrepareWrite(); err != nil { return err } - err := syscall.Connect(fd.sysfd, ra) - if err == syscall.EINPROGRESS { - if err = fd.pd.WaitWrite(); err != nil { - return err + for { + err := syscall.Connect(fd.sysfd, ra) + if err == nil || err == syscall.EISCONN { + break } - var e int - e, err = syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR) - if err != nil { - return os.NewSyscallError("getsockopt", err) + if err != syscall.EINPROGRESS && err != syscall.EALREADY && err != syscall.EINTR { + return err } - if e != 0 { - err = syscall.Errno(e) + if err = fd.pd.WaitWrite(); err != nil { + return err } } - return err + return nil } // Add a reference to this fd.