diff --git a/pyo3-build-config/src/lib.rs b/pyo3-build-config/src/lib.rs index 9bcaf34e..f870daa7 100644 --- a/pyo3-build-config/src/lib.rs +++ b/pyo3-build-config/src/lib.rs @@ -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 diff --git a/src/gil.rs b/src/gil.rs index e358a410..903f89d7 100644 --- a/src/gil.rs +++ b/src/gil.rs @@ -10,17 +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 = Cell::new(0); + static GIL_COUNT: Cell = const { Cell::new(0) }; /// Temporarily hold objects that will be released when the GILPool drops. - static OWNED_OBJECTS: RefCell>> = RefCell::new(Vec::with_capacity(256)); + static OWNED_OBJECTS: RefCell>> = const { RefCell::new(Vec::new()) }; } /// Checks whether the GIL is acquired.