pyo3::marker

Trait Ungil

source
pub unsafe trait Ungil { }
Expand description

Types that are safe to access while the GIL is not held.

§Safety

The type must not carry borrowed Python references or, if it does, not allow access to them if the GIL is not held.

See the module-level documentation for more information.

§Examples

This tracking is currently imprecise as it relies on the Send auto trait on stable Rust. For example, an Rc smart pointer should be usable without the GIL, but we currently prevent that:

use std::rc::Rc;

Python::with_gil(|py| {
    let rc = Rc::new(42);

    py.allow_threads(|| {
        println!("{:?}", rc);
    });
});

This also implies that the interplay between with_gil and allow_threads is unsound, for example one can circumvent this protection using the send_wrapper crate:

use send_wrapper::SendWrapper;

Python::with_gil(|py| {
    let string = PyString::new(py, "foo");

    let wrapped = SendWrapper::new(string);

    py.allow_threads(|| {
        let sneaky: &Bound<'_, PyString> = &*wrapped;

        println!("{:?}", sneaky);
    });
});

Fixing this loophole on stable Rust has significant ergonomic issues, but it is fixed when using nightly Rust and the nightly feature, c.f. #2141.

Implementors§

source§

impl<T: Send> Ungil for T