lock

Function lock 

Source
pub fn lock(proxy: &impl UntypedBorrowedProxyWrapper) -> BorrowedProxyLock<'_>
Expand description

Locks the proxy for concurrent destruction.

If the proxy is not already destroyed, holding this lock will prevent other threads from destroying it.

Trying to destroy the proxy from this thread while holding this lock will deadlock.

This lock only locks out concurrent destruction. Multiple threads can acquire this lock at the same time.

ยงExample

let lib = Libwayland::open().unwrap();
let con = lib.connect_to_default_display().unwrap();
let queue = con.create_queue(c"");
let display: WlDisplay = queue.display();

// Create a wl_callback that we will destroy in another thread.
let sync1 = display.sync();
let sync2 = sync1.clone();

// Lock the proxy to prevent the other thread from destroying it.
let lock = proxy::lock(&*sync1);

// Create a barrier to synchronize with the other thread.
let barrier1 = Arc::new(Barrier::new(2));
let barrier2 = barrier1.clone();

thread::spawn(move || {
    // This will block until the main thread has released the lock.
    proxy::destroy(&sync2);
    barrier2.wait();
});

// Sleep for a second to demonstrate that the proxy::destroy does in fact not proceed.
thread::sleep(Duration::from_secs(1));

// The other spawned thread has not yet destroyed the proxy.
assert!(lock.wl_proxy().is_some());
// Drop the lock to let the other thread proceed.
drop(lock);

// Wait for the other thread to run to completion.
barrier1.wait();

// The proxy is now destroyed.
assert!(proxy::wl_proxy(&*sync1).is_none());
Examples found in repository?
examples/async-window/../common/protocols/wayland/wl_subsurface.rs (line 289)
287    pub fn place_above(&self, sibling: &WlSurfaceRef) {
288        let (arg0,) = (sibling,);
289        let obj0_lock = proxy::lock(arg0);
290        let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
291        let mut args = [wl_argument { o: obj0 }];
292        // SAFETY: - self.proxy has the interface INTERFACE
293        //         - 2 < INTERFACE.method_count = 6
294        //         - the request signature is `o`
295        unsafe {
296            self.proxy.send_request(2, &mut args);
297        }
298    }
299
300    /// restack the sub-surface
301    ///
302    /// The sub-surface is placed just below the reference surface.
303    /// See wl_subsurface.place_above.
304    ///
305    /// # Arguments
306    ///
307    /// - `sibling`: the reference surface
308    #[inline]
309    pub fn place_below(&self, sibling: &WlSurfaceRef) {
310        let (arg0,) = (sibling,);
311        let obj0_lock = proxy::lock(arg0);
312        let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
313        let mut args = [wl_argument { o: obj0 }];
314        // SAFETY: - self.proxy has the interface INTERFACE
315        //         - 3 < INTERFACE.method_count = 6
316        //         - the request signature is `o`
317        unsafe {
318            self.proxy.send_request(3, &mut args);
319        }
320    }
More examples
Hide additional examples
examples/async-window/../common/protocols_data/wayland/wl_subsurface.rs (line 289)
287    pub fn place_above(&self, sibling: &WlSurfaceRef) {
288        let (arg0,) = (sibling,);
289        let obj0_lock = proxy::lock(arg0);
290        let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
291        let mut args = [wl_argument { o: obj0 }];
292        // SAFETY: - self.proxy has the interface INTERFACE
293        //         - 2 < INTERFACE.method_count = 6
294        //         - the request signature is `o`
295        unsafe {
296            self.proxy.send_request(2, &mut args);
297        }
298    }
299
300    /// restack the sub-surface
301    ///
302    /// The sub-surface is placed just below the reference surface.
303    /// See wl_subsurface.place_above.
304    ///
305    /// # Arguments
306    ///
307    /// - `sibling`: the reference surface
308    #[inline]
309    pub fn place_below(&self, sibling: &WlSurfaceRef) {
310        let (arg0,) = (sibling,);
311        let obj0_lock = proxy::lock(arg0);
312        let obj0 = check_argument_proxy("sibling", obj0_lock.wl_proxy());
313        let mut args = [wl_argument { o: obj0 }];
314        // SAFETY: - self.proxy has the interface INTERFACE
315        //         - 3 < INTERFACE.method_count = 6
316        //         - the request signature is `o`
317        unsafe {
318            self.proxy.send_request(3, &mut args);
319        }
320    }
examples/async-window/../common/protocols/wayland/wl_fixes.rs (line 164)
162    pub fn destroy_registry(&self, registry: &WlRegistryRef) {
163        let (arg0,) = (registry,);
164        let obj0_lock = proxy::lock(arg0);
165        let obj0 = check_argument_proxy("registry", obj0_lock.wl_proxy());
166        let mut args = [wl_argument { o: obj0 }];
167        // SAFETY: - self.proxy has the interface INTERFACE
168        //         - 1 < INTERFACE.method_count = 2
169        //         - the request signature is `o`
170        unsafe {
171            self.proxy.send_request(1, &mut args);
172        }
173    }
examples/async-window/../common/protocols_data/wayland/wl_fixes.rs (line 164)
162    pub fn destroy_registry(&self, registry: &WlRegistryRef) {
163        let (arg0,) = (registry,);
164        let obj0_lock = proxy::lock(arg0);
165        let obj0 = check_argument_proxy("registry", obj0_lock.wl_proxy());
166        let mut args = [wl_argument { o: obj0 }];
167        // SAFETY: - self.proxy has the interface INTERFACE
168        //         - 1 < INTERFACE.method_count = 2
169        //         - the request signature is `o`
170        unsafe {
171            self.proxy.send_request(1, &mut args);
172        }
173    }
examples/async-window/../common/protocols/xdg_shell/xdg_popup.rs (line 258)
256    pub fn grab(&self, seat: &WlSeatRef, serial: u32) {
257        let (arg0, arg1) = (seat, serial);
258        let obj0_lock = proxy::lock(arg0);
259        let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
260        let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
261        // SAFETY: - self.proxy has the interface INTERFACE
262        //         - 1 < INTERFACE.method_count = 3
263        //         - the request signature is `ou`
264        unsafe {
265            self.proxy.send_request(1, &mut args);
266        }
267    }
268
269    /// recalculate the popup's location
270    ///
271    /// Reposition an already-mapped popup. The popup will be placed given the
272    /// details in the passed xdg_positioner object, and a
273    /// xdg_popup.repositioned followed by xdg_popup.configure and
274    /// xdg_surface.configure will be emitted in response. Any parameters set
275    /// by the previous positioner will be discarded.
276    ///
277    /// The passed token will be sent in the corresponding
278    /// xdg_popup.repositioned event. The new popup position will not take
279    /// effect until the corresponding configure event is acknowledged by the
280    /// client. See xdg_popup.repositioned for details. The token itself is
281    /// opaque, and has no other special meaning.
282    ///
283    /// If multiple reposition requests are sent, the compositor may skip all
284    /// but the last one.
285    ///
286    /// If the popup is repositioned in response to a configure event for its
287    /// parent, the client should send an xdg_positioner.set_parent_configure
288    /// and possibly an xdg_positioner.set_parent_size request to allow the
289    /// compositor to properly constrain the popup.
290    ///
291    /// If the popup is repositioned together with a parent that is being
292    /// resized, but not in response to a configure event, the client should
293    /// send an xdg_positioner.set_parent_size request.
294    ///
295    /// # Arguments
296    ///
297    /// - `positioner`:
298    /// - `token`: reposition request token
299    #[inline]
300    pub fn reposition(&self, positioner: &XdgPositionerRef, token: u32) {
301        let (arg0, arg1) = (positioner, token);
302        let obj0_lock = proxy::lock(arg0);
303        let obj0 = check_argument_proxy("positioner", obj0_lock.wl_proxy());
304        let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
305        // SAFETY: - self.proxy has the interface INTERFACE
306        //         - 2 < INTERFACE.method_count = 3
307        //         - the request signature is `ou`
308        unsafe {
309            self.proxy.send_request(2, &mut args);
310        }
311    }
examples/async-window/../common/protocols_data/xdg_shell/xdg_popup.rs (line 258)
256    pub fn grab(&self, seat: &WlSeatRef, serial: u32) {
257        let (arg0, arg1) = (seat, serial);
258        let obj0_lock = proxy::lock(arg0);
259        let obj0 = check_argument_proxy("seat", obj0_lock.wl_proxy());
260        let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
261        // SAFETY: - self.proxy has the interface INTERFACE
262        //         - 1 < INTERFACE.method_count = 3
263        //         - the request signature is `ou`
264        unsafe {
265            self.proxy.send_request(1, &mut args);
266        }
267    }
268
269    /// recalculate the popup's location
270    ///
271    /// Reposition an already-mapped popup. The popup will be placed given the
272    /// details in the passed xdg_positioner object, and a
273    /// xdg_popup.repositioned followed by xdg_popup.configure and
274    /// xdg_surface.configure will be emitted in response. Any parameters set
275    /// by the previous positioner will be discarded.
276    ///
277    /// The passed token will be sent in the corresponding
278    /// xdg_popup.repositioned event. The new popup position will not take
279    /// effect until the corresponding configure event is acknowledged by the
280    /// client. See xdg_popup.repositioned for details. The token itself is
281    /// opaque, and has no other special meaning.
282    ///
283    /// If multiple reposition requests are sent, the compositor may skip all
284    /// but the last one.
285    ///
286    /// If the popup is repositioned in response to a configure event for its
287    /// parent, the client should send an xdg_positioner.set_parent_configure
288    /// and possibly an xdg_positioner.set_parent_size request to allow the
289    /// compositor to properly constrain the popup.
290    ///
291    /// If the popup is repositioned together with a parent that is being
292    /// resized, but not in response to a configure event, the client should
293    /// send an xdg_positioner.set_parent_size request.
294    ///
295    /// # Arguments
296    ///
297    /// - `positioner`:
298    /// - `token`: reposition request token
299    #[inline]
300    pub fn reposition(&self, positioner: &XdgPositionerRef, token: u32) {
301        let (arg0, arg1) = (positioner, token);
302        let obj0_lock = proxy::lock(arg0);
303        let obj0 = check_argument_proxy("positioner", obj0_lock.wl_proxy());
304        let mut args = [wl_argument { o: obj0 }, wl_argument { u: arg1 }];
305        // SAFETY: - self.proxy has the interface INTERFACE
306        //         - 2 < INTERFACE.method_count = 3
307        //         - the request signature is `ou`
308        unsafe {
309            self.proxy.send_request(2, &mut args);
310        }
311    }