1package sysfs
2
3import (
4 "unsafe"
5
6 "github.com/tetratelabs/wazero/experimental/sys"
7)
8
9// pollFd is the struct to query for file descriptor events using poll.
10type pollFd struct {
11 // fd is the file descriptor.
12 fd int32
13 // events is a bitmap containing the requested events.
14 events int16
15 // revents is a bitmap containing the returned events.
16 revents int16
17}
18
19// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors.
20func newPollFd(fd uintptr, events, revents int16) pollFd {
21 return pollFd{fd: int32(fd), events: events, revents: revents}
22}
23
24// _POLLIN subscribes a notification when any readable data is available.
25const _POLLIN = 0x0001
26
27// _poll implements poll on Darwin via the corresponding libc function.
28func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) {
29 var fdptr *pollFd
30 nfds := len(fds)
31 if nfds > 0 {
32 fdptr = &fds[0]
33 }
34 n1, _, err := syscall_syscall6(
35 libc_poll_trampoline_addr,
36 uintptr(unsafe.Pointer(fdptr)),
37 uintptr(nfds),
38 uintptr(int(timeoutMillis)),
39 uintptr(unsafe.Pointer(nil)),
40 uintptr(unsafe.Pointer(nil)),
41 uintptr(unsafe.Pointer(nil)))
42 return int(n1), sys.UnwrapOSError(err)
43}
44
45// libc_poll_trampoline_addr is the address of the
46// `libc_poll_trampoline` symbol, defined in `poll_darwin.s`.
47//
48// We use this to invoke the syscall through syscall_syscall6 imported below.
49var libc_poll_trampoline_addr uintptr
50
51// Imports the select symbol from libc as `libc_poll`.
52//
53// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value
54// or the "cgo" build flag. See /RATIONALE.md for why.
55//go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib"