Use a const initializer for `GIL_COUNT` if possible.
This commit is contained in:
parent
a3c4fd2fa0
commit
dee45d3644
|
@ -156,6 +156,11 @@ pub fn print_feature_cfgs() {
|
||||||
if rustc_minor_version >= 53 {
|
if rustc_minor_version >= 53 {
|
||||||
println!("cargo:rustc-cfg=option_insert");
|
println!("cargo:rustc-cfg=option_insert");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable use of const initializer for thread_local! on Rust 1.59 and greater
|
||||||
|
if rustc_minor_version >= 59 {
|
||||||
|
println!("cargo:rustc-cfg=thread_local_const_init");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Private exports used in PyO3's build.rs
|
/// Private exports used in PyO3's build.rs
|
||||||
|
|
18
src/gil.rs
18
src/gil.rs
|
@ -10,15 +10,29 @@ use std::{mem, ptr::NonNull, sync::atomic};
|
||||||
|
|
||||||
static START: Once = Once::new();
|
static START: Once = Once::new();
|
||||||
|
|
||||||
thread_local! {
|
cfg_if::cfg_if! {
|
||||||
|
if #[cfg(thread_local_const_init)] {
|
||||||
|
use std::thread_local as thread_local_const_init;
|
||||||
|
} else {
|
||||||
|
macro_rules! thread_local_const_init {
|
||||||
|
($(#[$attr:meta])* static $name:ident: $ty:ty = const { $init:expr };) => (
|
||||||
|
thread_local! { $(#[$attr])* static $name: $ty = $init; }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thread_local_const_init! {
|
||||||
/// This is an internal counter in pyo3 monitoring whether this thread has the GIL.
|
/// This is an internal counter in pyo3 monitoring whether this thread has the GIL.
|
||||||
///
|
///
|
||||||
/// It will be incremented whenever a GILGuard or GILPool is created, and decremented whenever
|
/// It will be incremented whenever a GILGuard or GILPool is created, and decremented whenever
|
||||||
/// they are dropped.
|
/// they are dropped.
|
||||||
///
|
///
|
||||||
/// As a result, if this thread has the GIL, GIL_COUNT is greater than zero.
|
/// As a result, if this thread has the GIL, GIL_COUNT is greater than zero.
|
||||||
static GIL_COUNT: Cell<usize> = Cell::new(0);
|
static GIL_COUNT: Cell<usize> = const { Cell::new(0) };
|
||||||
|
}
|
||||||
|
|
||||||
|
thread_local! {
|
||||||
/// Temporarily hold objects that will be released when the GILPool drops.
|
/// Temporarily hold objects that will be released when the GILPool drops.
|
||||||
static OWNED_OBJECTS: RefCell<Vec<NonNull<ffi::PyObject>>> = RefCell::new(Vec::with_capacity(256));
|
static OWNED_OBJECTS: RefCell<Vec<NonNull<ffi::PyObject>>> = RefCell::new(Vec::with_capacity(256));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue