Commit b18a7c7c authored by Rémy Oudompheng's avatar Rémy Oudompheng

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
parent e3e885bb
...@@ -375,8 +375,8 @@ func (fd *netFD) decref() { ...@@ -375,8 +375,8 @@ func (fd *netFD) decref() {
func (fd *netFD) Close() error { func (fd *netFD) Close() error {
fd.pollServer.Lock() // needed for both fd.incref(true) and pollserver.Evict fd.pollServer.Lock() // needed for both fd.incref(true) and pollserver.Evict
defer fd.pollServer.Unlock()
if err := fd.incref(true); err != nil { if err := fd.incref(true); err != nil {
fd.pollServer.Unlock()
return err return err
} }
// Unblock any I/O. Once it all unblocks and returns, // Unblock any I/O. Once it all unblocks and returns,
...@@ -385,6 +385,7 @@ func (fd *netFD) Close() error { ...@@ -385,6 +385,7 @@ func (fd *netFD) Close() error {
// fairly quickly, since all the I/O is non-blocking, and any // fairly quickly, since all the I/O is non-blocking, and any
// attempts to block in the pollserver will return errClosing. // attempts to block in the pollserver will return errClosing.
fd.pollServer.Evict(fd) fd.pollServer.Evict(fd)
fd.pollServer.Unlock()
fd.decref() fd.decref()
return nil return nil
} }
......
...@@ -61,7 +61,6 @@ func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr, ...@@ -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 { if err = fd.connect(ursa); err != nil {
closesocket(s) closesocket(s)
fd.Close()
return nil, err return nil, err
} }
fd.isConnected = true fd.isConnected = true
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment