x11: thread safe replacement for XNextEvent (#782)
XNextEvent will block for input while holding the global Xlib mutex. This will cause a deadlock in even the most trivial multi-threaded application because OpenGL functions will need to hold the Xlib mutex too. Add EventsLoop::poll_one_event and EventsLoop::wait_for_input to provide thread-safe functions to poll and wait events from the X11 event queue using unix select(2) and XCheckIfEvent. This is a somewhat ugly workaround to an ugly problem. Fixes #779
This commit is contained in:
parent
f000b82d74
commit
ab0a34012f
3 changed files with 81 additions and 6 deletions
|
|
@ -1,6 +1,7 @@
|
|||
use std::ptr;
|
||||
use std::fmt;
|
||||
use std::error::Error;
|
||||
use std::os::raw::c_int;
|
||||
|
||||
use libc;
|
||||
use parking_lot::Mutex;
|
||||
|
|
@ -18,6 +19,7 @@ pub struct XConnection {
|
|||
pub xinput2: ffi::XInput2,
|
||||
pub xlib_xcb: ffi::Xlib_xcb,
|
||||
pub display: *mut ffi::Display,
|
||||
pub x11_fd: c_int,
|
||||
pub latest_error: Mutex<Option<XError>>,
|
||||
}
|
||||
|
||||
|
|
@ -48,6 +50,11 @@ impl XConnection {
|
|||
display
|
||||
};
|
||||
|
||||
// Get X11 socket file descriptor
|
||||
let fd = unsafe {
|
||||
(xlib.XConnectionNumber)(display)
|
||||
};
|
||||
|
||||
Ok(XConnection {
|
||||
xlib,
|
||||
xrandr,
|
||||
|
|
@ -56,6 +63,7 @@ impl XConnection {
|
|||
xinput2,
|
||||
xlib_xcb,
|
||||
display,
|
||||
x11_fd: fd,
|
||||
latest_error: Mutex::new(None),
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue