| // 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(kq 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) |
| } |