Skip to content

Commit 6a76bca

Browse files
committed
net: separate pollster initialization from network file descriptor allocation
Unlike the existing net package own pollster, runtime-integrated network pollster on BSD variants, actually kqueue, requires a socket that has beed passed to syscall.Listen previously for a stream listener. This CL separates pollDesc.Init (actually runtime_pollOpen) from newFD to allow control of each state of sockets and adds init method to netFD instead. Upcoming CLs will rearrange the call order of runtime-integrated pollster and syscall functions like the following; - For dialers that open active connections, runtime_pollOpen will be called in between syscall.Bind and syscall.Connect. - For stream listeners that open passive stream connections, runtime_pollOpen will be called just after syscall.Listen. - For datagram listeners that open datagram connections, runtime_pollOpen will be called just after syscall.Bind. This is in preparation for runtime-integrated network pollster for BSD variants. Update #5199 R=dvyukov, alex.brainman, minux.ma CC=golang-dev https://golang.org/cl/8608044
1 parent 33bd969 commit 6a76bca

File tree

5 files changed

+37
-18
lines changed

5 files changed

+37
-18
lines changed

src/pkg/net/fd_poll_runtime.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ func (pd *pollDesc) Init(fd *netFD) error {
3838
}
3939

4040
func (pd *pollDesc) Close() {
41+
if pd.runtimeCtx == 0 {
42+
return
43+
}
4144
runtime_pollClose(pd.runtimeCtx)
45+
pd.runtimeCtx = 0
4246
}
4347

4448
func (pd *pollDesc) Lock() {
@@ -53,6 +57,9 @@ func (pd *pollDesc) Wakeup() {
5357
// Evict evicts fd from the pending list, unblocking any I/O running on fd.
5458
// Return value is whether the pollServer should be woken up.
5559
func (pd *pollDesc) Evict() bool {
60+
if pd.runtimeCtx == 0 {
61+
return false
62+
}
5663
runtime_pollUnblock(pd.runtimeCtx)
5764
return false
5865
}

src/pkg/net/fd_unix.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,15 @@ func resolveAndDial(net, addr string, localAddr Addr, deadline time.Time) (Conn,
5555
return dial(net, addr, localAddr, ra, deadline)
5656
}
5757

58-
func newFD(fd, family, sotype int, net string) (*netFD, error) {
59-
netfd := &netFD{
60-
sysfd: fd,
61-
family: family,
62-
sotype: sotype,
63-
net: net,
64-
}
65-
if err := netfd.pd.Init(netfd); err != nil {
66-
return nil, err
58+
func newFD(sysfd, family, sotype int, net string) (*netFD, error) {
59+
return &netFD{sysfd: sysfd, family: family, sotype: sotype, net: net}, nil
60+
}
61+
62+
func (fd *netFD) init() error {
63+
if err := fd.pd.Init(fd); err != nil {
64+
return err
6765
}
68-
return netfd, nil
66+
return nil
6967
}
7068

7169
func (fd *netFD) setAddr(laddr, raddr Addr) {
@@ -401,6 +399,10 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (netfd *netFD, err e
401399
closesocket(s)
402400
return nil, err
403401
}
402+
if err = netfd.init(); err != nil {
403+
fd.Close()
404+
return nil, err
405+
}
404406
lsa, _ := syscall.Getsockname(netfd.sysfd)
405407
netfd.setAddr(toAddr(lsa), toAddr(rsa))
406408
return netfd, nil

src/pkg/net/fd_windows.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,12 @@ func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error)
242242
return nil, initErr
243243
}
244244
onceStartServer.Do(startServer)
245-
fd := &netFD{
246-
sysfd: sysfd,
247-
family: family,
248-
sotype: sotype,
249-
net: net,
250-
}
245+
return &netFD{sysfd: sysfd, family: family, sotype: sotype, net: net}, nil
246+
}
247+
248+
func (fd *netFD) init() error {
251249
if err := fd.pd.Init(fd); err != nil {
252-
return nil, err
250+
return err
253251
}
254252
fd.rop.mode = 'r'
255253
fd.wop.mode = 'w'
@@ -261,7 +259,7 @@ func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error)
261259
fd.rop.errc = make(chan error)
262260
fd.rop.errc = make(chan error)
263261
}
264-
return fd, nil
262+
return nil
265263
}
266264

267265
func (fd *netFD) setAddr(laddr, raddr Addr) {
@@ -473,6 +471,10 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
473471
closesocket(s)
474472
return nil, &OpError{"accept", fd.net, fd.laddr, err}
475473
}
474+
if err := netfd.init(); err != nil {
475+
fd.Close()
476+
return nil, err
477+
}
476478

477479
// Submit accept request.
478480
o := &fd.rop

src/pkg/net/file_unix.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func newFileFD(f *os.File) (*netFD, error) {
6767
closesocket(fd)
6868
return nil, err
6969
}
70+
if err := netfd.init(); err != nil {
71+
netfd.Close()
72+
return nil, err
73+
}
7074
netfd.setAddr(laddr, raddr)
7175
return netfd, nil
7276
}

src/pkg/net/sock_posix.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ func socket(net string, f, t, p int, ipv6only bool, laddr, raddr sockaddr, deadl
9393
closesocket(s)
9494
return nil, err
9595
}
96+
if err := fd.init(); err != nil {
97+
fd.Close()
98+
return nil, err
99+
}
96100

97101
var rsa syscall.Sockaddr
98102
if raddr != nil {

0 commit comments

Comments
 (0)