代码拉取完成,页面将自动刷新
同步操作将从 tupelo-shen/mysnapd 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package netlink
import (
"fmt"
"math/bits"
"os"
"syscall"
)
// RawSockStopper returns a pair of functions to manage stopping code
// reading from a raw socket, readableOrStop blocks until
// fd is readable or stop was called. To work properly it sets fd
// to non-blocking mode.
// TODO: with go 1.11+ it should be possible to just switch to setting
// fd to non-blocking and then wrapping the socket via os.NewFile and
// use Close to force a read to stop.
// c.f. https://github.com/golang/go/commit/ea5825b0b64e1a017a76eac0ad734e11ff557c8e
func RawSockStopper(fd int) (readableOrStop func() (bool, error), stop func(), err error) {
if err := syscall.SetNonblock(fd, true); err != nil {
return nil, nil, err
}
stopR, stopW, err := os.Pipe()
if err != nil {
return nil, nil, err
}
// both stopR and stopW must be kept alive otherwise the corresponding
// file descriptors will get closed
readableOrStop = func() (bool, error) {
return stopperSelectReadable(fd, int(stopR.Fd()))
}
stop = func() {
stopW.Write([]byte{0})
}
return readableOrStop, stop, nil
}
func stopperSelectReadable(fd, stopFd int) (bool, error) {
maxFd := fd
if maxFd < stopFd {
maxFd = stopFd
}
if maxFd >= 1024 {
return false, fmt.Errorf("fd too high for syscall.Select")
}
fdIdx := fd / bits.UintSize
fdShift := uint(fd) % bits.UintSize
stopFdIdx := stopFd / bits.UintSize
stopFdShift := uint(stopFd) % bits.UintSize
readable := false
tout := stopperSelectTimeout()
for {
var r syscall.FdSet
r.Bits[fdIdx] = 1 << fdShift
r.Bits[stopFdIdx] |= 1 << stopFdShift
_, err := syscall.Select(maxFd+1, &r, nil, nil, tout)
if errno, ok := err.(syscall.Errno); ok && errno.Temporary() {
continue
}
if err != nil {
return false, err
}
readable = (r.Bits[fdIdx] & (1 << fdShift)) != 0
break
}
return readable, nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。