1
0
mirror of https://github.com/golang/go synced 2024-09-29 00:24:30 -06:00

internal/poll: don't add non-sockets to runtime poller

Updates #21172

Change-Id: I0fec6e645328bbc85f3e47f4f71dd8d1d68c75ab
Reviewed-on: https://go-review.googlesource.com/52551
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
This commit is contained in:
Ian Lance Taylor 2017-08-01 16:05:17 -07:00
parent 664cd26c89
commit f396fa4285

View File

@ -154,6 +154,10 @@ func (s *ioSrv) ProcessRemoteIO() {
// is available. Alternatively, it passes the request onto // is available. Alternatively, it passes the request onto
// runtime netpoll and waits for completion or cancels request. // runtime netpoll and waits for completion or cancels request.
func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, error) { func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, error) {
if o.fd.pd.runtimeCtx == 0 {
return 0, errors.New("internal error: polling on unsupported descriptor type")
}
if !canCancelIO { if !canCancelIO {
onceStartServer.Do(startServer) onceStartServer.Do(startServer)
} }
@ -315,9 +319,22 @@ func (fd *FD) Init(net string) (string, error) {
return "", errors.New("internal error: unknown network type " + net) return "", errors.New("internal error: unknown network type " + net)
} }
if !fd.isFile && !fd.isConsole && !fd.isDir {
// Only call init for a network socket.
// This means that we don't add files to the runtime poller.
// Adding files to the runtime poller can confuse matters
// if the user is doing their own overlapped I/O.
// See issue #21172.
//
// In general the code below avoids calling the ExecIO
// method for non-network sockets. If some method does
// somehow call ExecIO, then ExecIO, and therefore the
// calling method, will return an error, because
// fd.pd.runtimeCtx will be 0.
if err := fd.pd.init(fd); err != nil { if err := fd.pd.init(fd); err != nil {
return "", err return "", err
} }
}
if hasLoadSetFileCompletionNotificationModes { if hasLoadSetFileCompletionNotificationModes {
// We do not use events, so we can skip them always. // We do not use events, so we can skip them always.
flags := uint8(syscall.FILE_SKIP_SET_EVENT_ON_HANDLE) flags := uint8(syscall.FILE_SKIP_SET_EVENT_ON_HANDLE)