]> Cypherpunks repositories - gostls13.git/commitdiff
net: remove unnecessary Close contention.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Sat, 1 Dec 2012 08:26:07 +0000 (09:26 +0100)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Sat, 1 Dec 2012 08:26:07 +0000 (09:26 +0100)
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
src/pkg/net/sock_posix.go

index 9326b6278a0e1b2cb9f636946aba95a62ce5f6fb..a9a2ae6e85b9c347c16a541804556ab8d2b70032 100644 (file)
@@ -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
 }
index ecaf71705e746d6f9cdc9200587456a35e200028..dce5ec1132d907eeff40736a797594553684a0a7 100644 (file)
@@ -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