net: fix memory leak on unix
If netFD is closed by finalizer, runtime netpoll descriptor is not freed.
R=golang-dev, dave, alex.brainman
CC=golang-dev
https://golang.org/cl/12037043
diff --git a/src/pkg/net/fd_unix.go b/src/pkg/net/fd_unix.go
index 4012e36..5f8a670 100644
--- a/src/pkg/net/fd_unix.go
+++ b/src/pkg/net/fd_unix.go
@@ -9,6 +9,7 @@
import (
"io"
"os"
+ "runtime"
"sync"
"syscall"
"time"
@@ -29,7 +30,6 @@
family int
sotype int
isConnected bool
- sysfile *os.File
net string
laddr Addr
raddr Addr
@@ -70,7 +70,7 @@
func (fd *netFD) setAddr(laddr, raddr Addr) {
fd.laddr = laddr
fd.raddr = raddr
- fd.sysfile = os.NewFile(uintptr(fd.sysfd), fd.net)
+ runtime.SetFinalizer(fd, (*netFD).Close)
}
func (fd *netFD) name() string {
@@ -129,15 +129,11 @@
fd.sysref--
if fd.closing && fd.sysref == 0 {
// Poller may want to unregister fd in readiness notification mechanism,
- // so this must be executed before sysfile.Close().
+ // so this must be executed before closesocket.
fd.pd.Close()
- if fd.sysfile != nil {
- fd.sysfile.Close()
- fd.sysfile = nil
- } else {
- closesocket(fd.sysfd)
- }
+ closesocket(fd.sysfd)
fd.sysfd = -1
+ runtime.SetFinalizer(fd, nil)
}
fd.sysmu.Unlock()
}