[Bf-blender-cvs] [bbe7183cd39] master: GHOST/Wayland: fix threaded event handling
Campbell Barton
noreply at git.blender.org
Fri Jan 13 07:56:29 CET 2023
Commit: bbe7183cd39de1417f27d2558bb717dd1aa1081d
Author: Campbell Barton
Date: Fri Jan 13 17:48:50 2023 +1100
Branches: master
https://developer.blender.org/rBbbe7183cd39de1417f27d2558bb717dd1aa1081d
GHOST/Wayland: fix threaded event handling
The previous fix from T100855 [0] no longer works on my system
(3.4.1 release also fails for GNOME/KDE/WLROOTS compositors).
Resolve by removing the loop from the wait-on-file handle check.
Also reduce locking/unlocking calls.
[0]: 37b256e26feb454d9febd84dac1b1ce8b8d84d90
===================================================================
M intern/ghost/intern/GHOST_SystemWayland.cpp
===================================================================
diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp
index d823db2afd7..ef8ccd66685 100644
--- a/intern/ghost/intern/GHOST_SystemWayland.cpp
+++ b/intern/ghost/intern/GHOST_SystemWayland.cpp
@@ -1669,24 +1669,24 @@ static int ghost_wl_display_event_pump_from_thread(struct wl_display *wl_display
else {
wl_display_cancel_read(wl_display);
}
+
+ server_mutex->unlock();
}
else {
- int state;
- do {
- server_mutex->unlock();
- /* Wait for input (unlocked, so as not to block other threads). */
- state = file_descriptor_is_io_ready(fd, GWL_IOR_READ | GWL_IOR_NO_RETRY, INT32_MAX);
+ server_mutex->unlock();
+
+ /* Wait for input (unlocked, so as not to block other threads). */
+ int state = file_descriptor_is_io_ready(fd, GWL_IOR_READ | GWL_IOR_NO_RETRY, INT32_MAX);
+ /* Re-check `state` with a lock held, needed to avoid holding the lock. */
+ if (state > 0) {
server_mutex->lock();
- /* Re-check `state` with a lock held, needed to avoid holding the lock. */
+ state = file_descriptor_is_io_ready(fd, GWL_IOR_READ | GWL_IOR_NO_RETRY, 0);
if (state > 0) {
- state = file_descriptor_is_io_ready(fd, GWL_IOR_READ | GWL_IOR_NO_RETRY, 0);
- if (state > 0) {
- err = wl_display_dispatch_pending(wl_display);
- }
+ err = wl_display_dispatch_pending(wl_display);
}
- } while (state > 0);
+ server_mutex->unlock();
+ }
}
- server_mutex->unlock();
return err;
}
More information about the Bf-blender-cvs
mailing list