mirror of
https://github.com/golang/go
synced 2024-11-26 05:07:59 -07:00
internal/poll, runtime: handle netpollopen error in poll_runtime_pollOpen
When netpollopen in poll_runtime_pollOpen returns an error, the work in runtime_pollUnblock and runtime_pollClose can be avoided since the underlying system call to set up the poller failed. E.g. on linux, this avoids calling netpollclose and thus epoll_ctl(fd, EPOLL_CTL_DEL, ...) in case the file does not support epoll, i.e. epoll_ctl(fd, EPOLL_CTL_ADD, ...) in netpollopen failed. Fixes #44552 Change-Id: I564d90340fd1ab3a6490526353616a447ae0cfb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/297392 Trust: Tobias Klauser <tobias.klauser@gmail.com> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
4c1a7ab49c
commit
ebb92dfed9
@ -39,10 +39,6 @@ func (pd *pollDesc) init(fd *FD) error {
|
||||
serverInit.Do(runtime_pollServerInit)
|
||||
ctx, errno := runtime_pollOpen(uintptr(fd.Sysfd))
|
||||
if errno != 0 {
|
||||
if ctx != 0 {
|
||||
runtime_pollUnblock(ctx)
|
||||
runtime_pollClose(ctx)
|
||||
}
|
||||
return errnoErr(syscall.Errno(errno))
|
||||
}
|
||||
pd.runtimeCtx = ctx
|
||||
|
@ -162,9 +162,12 @@ func poll_runtime_pollOpen(fd uintptr) (*pollDesc, int) {
|
||||
pd.self = pd
|
||||
unlock(&pd.lock)
|
||||
|
||||
var errno int32
|
||||
errno = netpollopen(fd, pd)
|
||||
return pd, int(errno)
|
||||
errno := netpollopen(fd, pd)
|
||||
if errno != 0 {
|
||||
pollcache.free(pd)
|
||||
return nil, int(errno)
|
||||
}
|
||||
return pd, 0
|
||||
}
|
||||
|
||||
//go:linkname poll_runtime_pollClose internal/poll.runtime_pollClose
|
||||
|
Loading…
Reference in New Issue
Block a user