diff --git a/entry/src/entry.rs b/entry/src/entry.rs index c40caf584c5050..6877e73dcb7f92 100644 --- a/entry/src/entry.rs +++ b/entry/src/entry.rs @@ -32,7 +32,7 @@ use { cmp, ffi::OsStr, iter::repeat_with, - sync::{Arc, Mutex, Once}, + sync::{Arc, Mutex, Once, OnceLock}, thread::{self, JoinHandle}, time::Instant, }, @@ -41,7 +41,7 @@ use { pub type EntrySender = Sender>; pub type EntryReceiver = Receiver>; -static mut API: Option> = None; +static API: OnceLock> = OnceLock::new(); pub fn init_poh() { init(OsStr::new("libpoh-simd.so")); @@ -51,23 +51,23 @@ fn init(name: &OsStr) { static INIT_HOOK: Once = Once::new(); info!("Loading {:?}", name); - unsafe { - INIT_HOOK.call_once(|| { - let path; - let lib_name = if let Some(perf_libs_path) = solana_perf::perf_libs::locate_perf_libs() - { - solana_perf::perf_libs::append_to_ld_library_path( - perf_libs_path.to_str().unwrap_or("").to_string(), - ); - path = perf_libs_path.join(name); - path.as_os_str() - } else { - name - }; + INIT_HOOK.call_once(|| { + let path; + let lib_name = if let Some(perf_libs_path) = solana_perf::perf_libs::locate_perf_libs() { + solana_perf::perf_libs::append_to_ld_library_path( + perf_libs_path.to_str().unwrap_or("").to_string(), + ); + path = perf_libs_path.join(name); + path.as_os_str() + } else { + name + }; - API = Container::load(lib_name).ok(); - }) - } + match unsafe { Container::load(lib_name) } { + Ok(api) => _ = API.set(api), + Err(err) => error!("Unable to load {lib_name:?}: {err}"), + } + }) } pub fn api() -> Option<&'static Container>> { @@ -77,10 +77,10 @@ pub fn api() -> Option<&'static Container>> { if std::env::var("TEST_PERF_LIBS").is_ok() { init_poh() } - }) + }); } - unsafe { API.as_ref() } + API.get() } #[derive(SymBorApi)]