Bug 258412 - kevent EVFILT_TIMER, EV_DISPATCH lost if event is re-enabled
Summary: kevent EVFILT_TIMER, EV_DISPATCH lost if event is re-enabled
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: 13.0-RELEASE
Hardware: Any Any
: --- Affects Some People
Assignee: freebsd-bugs (Nobody)
Depends on:
Reported: 2021-09-10 18:56 UTC by Arran Cudbard-Bell
Modified: 2021-09-10 22:22 UTC (History)
0 users

See Also:


Note You need to log in before you can comment on or make changes to this bug.
Description Arran Cudbard-Bell 2021-09-10 18:56:04 UTC
Currently expanding libkqueue tests.  libkqueue implements kqueue for Linux, Solaris and Windows as a userland library.

One test - test_kevent_timer_dispatch - appears to fail on both macOS 11.5.2 and FreeBSD 13 but for different reasons.

Test steps are below:

- Add a new timer, EV_SET(kq, 4, EVFILT_TIMER, EV_ADD, EV_DISPATCH, 0, 200, NULL)
- Call kevent, wait for timer to fire.
- Verify one kevent was returned the the correct flags and data field set to 1.
- Wait 500ms.
- Verify no more kevents are available.

- Re-enable timer, EV_SET(kq, 4, EVFILT_TIMER, EV_ENABLE | EV_DISPATCH, 0, 200, NULL)
- Verify no events are generated instantaneously.

The above step fails on FreeBSD 13, we get one event with the data field set to 1.

- Wait 1s
- Check that exactly 1 event has fired.

The above step fails on macOS, we get one event with the data field set to 5.

Adding EV_ADD to the call re-enabling the timer does nothing, as does only passing EV_ENABLE.

To run the test suite containing the failing test:

  git clone https://github.com/mheily/libkqueue.git
  cd libkqueue
  cmake . test/CMakeLists.txt -DWITH_NATIVE_KQUEUE_BUGS=1
  make -C test/
  ./test/libkqueue-test timer

You'll need the cmake, git, and gcc or llvm pkgs installed.  There are no other dependencies.

The actual test is available here: https://github.com/mheily/libkqueue/blob/935ebc39f78d2e06ce0d20f6c297e4b2b7e4c1bc/test/timer.c#L122

I believe FreeBSD pulled in libkqueue's test suite at some point in the distant past.  The test framework hasn't changed much in the past 10 years so you may be able to just drop the updated test in.
Comment 1 Arran Cudbard-Bell 2021-09-10 22:22:04 UTC
After investigating further macOS seems to be behaving correctly, as the event is only disabled when it is retrieved which is after sleeping for 1s. It would make sense then for the data field to contain 5.

The FreeBSD behaviour still seems erroneous however.