kqueue: Multiple fixes and simplifications

Desktop / GNOME / GLib - Martin Pieuchot [openbsd.org] - 13 March 2018 12:23 EDT

- Stop using a custom thread for listening to kqueue(2) events. Instead call kevent(2) in non blocking mode in a monitor callback. Under the hood poll(2) is used to figure out if new events are available.

- Do not use a socketpair with a custom protocol requiring 2 supplementary context switches per event to commicate between multiple threads. Calling kevent(2), in non blocking mode, to add/remove events is fine from any context.

- Add kqueue(2) events without the EV_ONESHOT flag. This removes a race where some notifications were lost because events had to be re-added for every new notification.

- Get rid of the global hash table and its associated lock and races. Use the 'cookie' argument of kevent(2) to pass the associated descriptor when registering an event.

- Fix _kh_file_appeared_cb() by properly passing a monitor instead of a source to g_file_monitor_emit_event().

- Properly refcount sources.

- Remove a lot of abstraction making it harder to fix the remaining issues.

https://bugzilla.gnome.org/show_bug.cgi?id=739424

aa39a0557 kqueue: Multiple fixes and simplifications
gio/kqueue/Makefile.am | 10 --
gio/kqueue/gkqueuefilemonitor.c | 368 +++++++++++++++++++++++++++++++-------
gio/kqueue/gkqueuefilemonitor.h | 51 ------
gio/kqueue/kqueue-exclusions.c | 65 -------
gio/kqueue/kqueue-exclusions.h | 28 ---
gio/kqueue/kqueue-helper.c | 380 +---------------------------------------
gio/kqueue/kqueue-helper.h | 31 +++-
gio/kqueue/kqueue-missing.c | 53 +++---
gio/kqueue/kqueue-missing.h | 32 ----
gio/kqueue/kqueue-sub.c | 79 ---------
gio/kqueue/kqueue-sub.h | 50 ------
gio/kqueue/kqueue-thread.c | 304 --------------------------------
gio/kqueue/kqueue-thread.h | 45 -----
gio/kqueue/kqueue-utils.c | 210 ----------------------
gio/kqueue/kqueue-utils.h | 53 ------
gio/kqueue/meson.build | 6 -
16 files changed, 363 insertions(+), 1402 deletions(-)

Upstream: git.gnome.org


  • Share