diff --git a/src/lib.rs b/src/lib.rs index 8f679f5..055c26f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,6 +59,11 @@ pub fn main(mut data: impl RunData) -> Option<()> { data.created_server(); let (xsock_wl, xsock_xwl) = UnixStream::pair().unwrap(); + // XCB takes responsibility for cleaning up this FD, but since connecting takes a RawFd at the + // FFI level, see (`XState::new`), `xsock_wl`'s destructor also closes the FD, leading the FD + // being closed twice. This mainly caused problems in the integration tests, where `xsock_wl`'s + // destructor would be run after the descriptor was freed, leading to an opaque abort message. + let xsock_wl = Box::leak(Box::new(xsock_wl)); // Prevent creation of new Xwayland command from closing fd rustix::io::fcntl_setfd(&xsock_xwl, rustix::io::FdFlags::empty()).unwrap(); diff --git a/tests/integration.rs b/tests/integration.rs index 104d25f..b8c61f5 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -99,7 +99,9 @@ impl Drop for Fixture { // thread does not use file descriptors which outlive the Fixture's BorrowedFd let return_ptr = Box::into_raw(Box::new(0_usize)) as usize; self.quit_tx.write_all(&return_ptr.to_ne_bytes()).unwrap(); - thread.join().expect("Main thread panicked"); + if thread.join().is_err() { + log::error!("main thread panicked"); + } rustix::process::kill_process(self.pid, Signal::Term).unwrap(); rustix::process::waitpid(Some(self.pid), WaitOptions::NOHANG).unwrap(); } @@ -891,7 +893,7 @@ fn activation_x11_to_x11() { let surface2 = f.map_as_toplevel(&mut connection, window2); f.testwl.focus_toplevel(surface2); - std::thread::sleep(Duration::from_millis(1)); + std::thread::sleep(Duration::from_millis(10)); connection.send_client_message(&x::ClientMessageEvent::new( window1, connection.atoms.net_active_window,