7c06f018a5
will be used for net/xfreerdp2
48 lines
2.2 KiB
Text
48 lines
2.2 KiB
Text
This is a small library that implements epoll on top of kqueue. It
|
|
has been successfully used to port libinput, libevdev, Wayland and
|
|
more software to FreeBSD: https://www.freshports.org/devel/libepoll-shim/
|
|
|
|
It may be useful for porting other software that uses epoll as well.
|
|
|
|
The library provides implementation of Linux timerfd_create(2) related
|
|
APIs, eventfd(2), signalfd(2).
|
|
|
|
However, this library contains some very ugly hacks and workarounds.
|
|
For example:
|
|
|
|
- When using timerfd, signalfd or eventfd, the system calls read,
|
|
write and close are redefined as macros to internal helper
|
|
functions. This is needed as there is some internal context that
|
|
has to be free'd properly. This means that you shouldn't create
|
|
a timerfd/signalfd in one part of a program and close it in a
|
|
different part where sys/timerfd.h isn't included. The context
|
|
would leak. Luckily, software such as libinput behaves very nicely
|
|
and puts all timerfd related code in a single source file.
|
|
|
|
- There is limited support for file descriptors that lack support
|
|
for kqueue but are supported by poll(2). This includes graphics
|
|
or sound devices under /dev. Those descriptors are handled in an
|
|
outer poll(2) loop. Edge triggering using EPOLLET will not work.
|
|
|
|
- Shimmed file descriptors cannot be shared between processes. On
|
|
fork() those fds are closed. When trying to pass a shimmed fd to
|
|
another process the sendmsg call will return EOPNOTSUPP. In most
|
|
cases sharing epoll/timerfd/signalfd is a bad idea anyway, but
|
|
there are some legitimate use cases (for example sharing semaphore
|
|
eventfds, issue #23). When the OS natively supports eventfds (as
|
|
is the case for FreeBSD >= 13) this library won't provide eventfd
|
|
shims or the sys/eventfd.h header.
|
|
|
|
- There is no proper notification mechanism for changes to the
|
|
system CLOCK_REALTIME clock on BSD systems. Also, kevent
|
|
EVFILT_TIMERs use the system monotonic clock as reference.
|
|
Therefore, in order to implement absolute (TFD_TIMER_ABSTIME)
|
|
CLOCK_REALTIME timerfds or cancellation support
|
|
(TFD_TIMER_CANCEL_ON_SET), a thread is spawned that periodically
|
|
polls the system boot time for changes to the realtime clock.
|
|
|
|
The following operating systems are supported:
|
|
|
|
FreeBSD >= 11.4, >= 12.2, >= 13.0
|
|
NetBSD >= 9.1
|
|
OpenBSD >= 6.7
|