Use a const initializer for `GIL_COUNT` if possible.

This commit is contained in:
Kang Seonghoon 2023-05-22 11:31:20 +09:00
parent a3c4fd2fa0
commit dee45d3644
2 changed files with 21 additions and 2 deletions

View File

@ -156,6 +156,11 @@ pub fn print_feature_cfgs() {
if rustc_minor_version >= 53 {
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

View File

@ -10,15 +10,29 @@ use std::{mem, ptr::NonNull, sync::atomic};
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.
///
/// It will be incremented whenever a GILGuard or GILPool is created, and decremented whenever
/// they are dropped.
///
/// 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.
static OWNED_OBJECTS: RefCell<Vec<NonNull<ffi::PyObject>>> = RefCell::new(Vec::with_capacity(256));
}