jiixyj / epoll-shim

small epoll implementation using kqueue; includes all features needed for libinput/libevdev
MIT License
91 stars 24 forks source link

kqueue1 implementation here and FreeBSD's diverge #46

Closed fogti closed 1 year ago

fogti commented 1 year ago

https://lists.freebsd.org/archives/freebsd-current/2023-March/003391.html

From: Ed Maste emaste@freebsd.org Date: Fri, 31 Mar 2023 17:27:54 UTC

On Fri, 31 Mar 2023 at 12:38, Charlie Li vishwin@freebsd.org wrote:

Konstantin Belousov wrote:

The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=61194e9852e641d1533cd04a5679d6042ff975d3

commit 61194e9852e641d1533cd04a5679d6042ff975d3 Author: Konstantin Belousov kib@FreeBSD.org AuthorDate: 2023-03-25 23:39:02 +0000 Commit: Konstantin Belousov kib@FreeBSD.org CommitDate: 2023-03-27 23:39:26 +0000

 Add kqueue1() syscall

 It takes the flags argument.  Immediate use is to provide the KQUEUE_CLOEXEC
 flag for kqueue(2).

This commit series causes x11/libinput to hit an assert (which also silently crashes X on launch): Assertion failed: (libinput->refcount > 0), function libinput_unref, file ../src/libinput.c, line 1957.

devel/libepoll-shim, x11/libinput's prime dependency, has its own kqueue1() implementation, which is used when the system does not already have one. Reverting this series and rebuilding devel/libepoll-shim to use its included implementation allows x11/libinput to work again.

Ah, NetBSD added kqueue1 some time ago, and it uses the already existing flags (O_CLOEXEC etc.) If it's easy to test, can you try changing libepoll-shim to call kqueue1(KQUEUE_CLOEXEC)?

jiixyj commented 1 year ago

Thanks for bringing this to my attention!

While this is a very welcome change, it's unfortunate that they didn't copy NetBSD's kqueue1 interface. Now there are two kqueue1 versions with different semantics. Is there any chance that FreeBSD could change their kqueue1 interface to match NetBSD's which has been there for quite a long time? Surely epoll-shim is not the only project which does configure time checking for kqueue1 vs. kqueue and will now stumble over this issue...

To match NetBSD's kqueue1, it would be nice if they accepted O_NONBLOCK as well. Otherwise, I would have to insert some FreeBSD specific logic which filters O_NONBLOCK before it enters kqueue1.

jiixyj commented 1 year ago

It looks like this is going to be fixed: https://reviews.freebsd.org/D39377

igalic commented 1 year ago

I think we can close this now that FreeBSD is in-line with NetBSD