From b18a7c7caeca314f71326cfa9b59ea3bbcbf0850 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9my=20Oudompheng?= Date: Sat, 1 Dec 2012 09:26:07 +0100 Subject: [PATCH] net: remove unnecessary Close contention. Contention profile in BenchmarkTCPOneShot (Core 2 Quad): Before Total: 80.285 seconds 44.743 55.7% 55.7% 44.743 55.7% runtime.chanrecv1 31.995 39.9% 95.6% 31.995 39.9% sync.(*Mutex).Lock 3.547 4.4% 100.0% 3.547 4.4% runtime.chansend1 After Total: 48.341 seconds 45.810 94.8% 94.8% 45.810 94.8% runtime.chanrecv1 2.530 5.2% 100.0% 2.530 5.2% runtime.chansend1 0.001 0.0% 100.0% 0.001 0.0% sync.(*Mutex).Lock R=golang-dev, dave, mikioh.mikioh CC=golang-dev https://golang.org/cl/6845119 --- src/pkg/net/fd_unix.go | 3 ++- src/pkg/net/sock_posix.go | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go index 9326b6278a..a9a2ae6e85 100644 --- a/src/pkg/net/fd_unix.go +++ b/src/pkg/net/fd_unix.go @@ -375,8 +375,8 @@ func (fd *netFD) decref() { func (fd *netFD) Close() error { fd.pollServer.Lock() // needed for both fd.incref(true) and pollserver.Evict - defer fd.pollServer.Unlock() if err := fd.incref(true); err != nil { + fd.pollServer.Unlock() return err } // Unblock any I/O. Once it all unblocks and returns, @@ -385,6 +385,7 @@ func (fd *netFD) Close() error { // fairly quickly, since all the I/O is non-blocking, and any // attempts to block in the pollserver will return errClosing. fd.pollServer.Evict(fd) + fd.pollServer.Unlock() fd.decref() return nil } diff --git a/src/pkg/net/sock_posix.go b/src/pkg/net/sock_posix.go index ecaf71705e..dce5ec1132 100644 --- a/src/pkg/net/sock_posix.go +++ b/src/pkg/net/sock_posix.go @@ -61,7 +61,6 @@ func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr, } if err = fd.connect(ursa); err != nil { closesocket(s) - fd.Close() return nil, err } fd.isConnected = true -- 2.48.1