you set non blocking here for handle read:
|
if err = setNonblock(desc.fd(), true); err != nil { |
|
return nil, os.NewSyscallError("setnonblock", err) |
|
} |
but on poller.Start(), the call to fd() would set underlying file to blocking mode again.
|
return p.Add(desc.fd(), events, n, func(kev Kevent) { |
// Fd returns the integer Unix file descriptor referencing the open file.
// The file descriptor is valid only until f.Close is called or f is garbage collected.
// On Unix systems this will cause the SetDeadline methods to stop working.
func (f *File) Fd() uintptr {
if f == nil {
return ^(uintptr(0))
}
// If we put the file descriptor into nonblocking mode,
// then set it to blocking mode before we return it,
// because historically we have always returned a descriptor
// opened in blocking mode. The File will continue to work,
// but any blocking operation will tie up a thread.
if f.nonblock {
f.pfd.SetBlocking()
}
return uintptr(f.pfd.Sysfd)
}
This caused set deadliner doesn't work on conn owned by poller
you set non blocking here for handle read:
easygo/netpoll/handle.go
Lines 91 to 93 in 0c8322a
but on poller.Start(), the call to fd() would set underlying file to blocking mode again.
easygo/netpoll/netpoll_kqueue.go
Line 25 in 0c8322a
This caused set deadliner doesn't work on conn owned by poller