mirror of https://go.googlesource.com/go
81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
// Copyright 2024 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
//go:build darwin || dragonfly || freebsd
|
|
|
|
package runtime
|
|
|
|
// Magic number of identifier used for EVFILT_USER.
|
|
// This number had zero Google results when it's created.
|
|
// That way, people will be directed here when this number
|
|
// get printed somehow and they search for it.
|
|
const kqIdent = 0xee1eb9f4
|
|
|
|
func addWakeupEvent(_ int32) {
|
|
ev := keventt{
|
|
ident: kqIdent,
|
|
filter: _EVFILT_USER,
|
|
flags: _EV_ADD,
|
|
}
|
|
for {
|
|
n := kevent(kq, &ev, 1, nil, 0, nil)
|
|
if n == 0 {
|
|
break
|
|
}
|
|
if n == -_EINTR {
|
|
// All changes contained in the changelist should have been applied
|
|
// before returning EINTR. But let's be skeptical and retry it anyway,
|
|
// to make a 100% commitment.
|
|
continue
|
|
}
|
|
println("runtime: kevent for EVFILT_USER failed with", -n)
|
|
throw("runtime: kevent failed")
|
|
}
|
|
}
|
|
|
|
func wakeNetpoll(kq int32) {
|
|
ev := keventt{
|
|
ident: kqIdent,
|
|
filter: _EVFILT_USER,
|
|
flags: _EV_ENABLE,
|
|
fflags: _NOTE_TRIGGER,
|
|
}
|
|
for {
|
|
n := kevent(kq, &ev, 1, nil, 0, nil)
|
|
if n == 0 {
|
|
break
|
|
}
|
|
if n == -_EINTR {
|
|
// Check out the comment in addWakeupEvent.
|
|
continue
|
|
}
|
|
println("runtime: netpollBreak write failed with", -n)
|
|
throw("runtime: netpollBreak write failed")
|
|
}
|
|
}
|
|
|
|
func isWakeup(ev *keventt) bool {
|
|
if ev.filter == _EVFILT_USER {
|
|
if ev.ident == kqIdent {
|
|
return true
|
|
}
|
|
println("runtime: netpoll: break fd ready for", ev.ident)
|
|
throw("runtime: netpoll: break fd ready for something unexpected")
|
|
}
|
|
return false
|
|
}
|
|
|
|
func drainWakeupEvent(kq int32) {
|
|
ev := keventt{
|
|
ident: kqIdent,
|
|
filter: _EVFILT_USER,
|
|
flags: _EV_DISABLE,
|
|
}
|
|
kevent(kq, &ev, 1, nil, 0, nil)
|
|
}
|
|
|
|
func netpollIsPollDescriptor(fd uintptr) bool {
|
|
return fd == uintptr(kq)
|
|
}
|