statsig_rust/networking/providers/
net_provider_global.rs1use crate::{log_e, networking::NetworkProvider};
2use parking_lot::Mutex;
3use std::{
4 sync::{Arc, Weak},
5 time::Duration,
6};
7
8lazy_static::lazy_static! {
9 static ref INSTANCE: Mutex<Option<Weak<dyn NetworkProvider>>> = Mutex::new(None);
10}
11
12const TAG: &str = stringify!(NetworkProviderGlobal);
13
14pub struct NetworkProviderGlobal;
15
16impl NetworkProviderGlobal {
17 pub fn try_get() -> Option<Weak<dyn NetworkProvider>> {
18 let lock = match INSTANCE.try_lock_for(Duration::from_secs(5)) {
19 Some(lock) => lock,
20 None => {
21 log_e!(
22 TAG,
23 "Failed to get network provider: Failed to lock INSTANCE"
24 );
25 return None;
26 }
27 };
28
29 match lock.as_ref() {
30 Some(weak) => Some(weak.clone()),
31 None => None,
32 }
33 }
34
35 pub fn set(provider: &Arc<dyn NetworkProvider>) {
36 match INSTANCE.try_lock_for(Duration::from_secs(5)) {
37 Some(mut instance) => {
38 *instance = Some(Arc::downgrade(provider));
39 }
40 None => {
41 log_e!(
42 TAG,
43 "Failed to set network provider: Failed to lock INSTANCE"
44 );
45 }
46 }
47 }
48}