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:
parent
664cd26c89
commit
f396fa4285
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user