use crate::debugger::{call::CallCache, debugee::dwarf::r#type::TypeCache};
use std::{
cell::RefCell,
sync::{LazyLock, Mutex},
};
#[derive(Default)]
struct SingleThreadPromise<T: Default>(T);
unsafe impl<T: Default> Sync for SingleThreadPromise<T> {}
unsafe impl<T: Default> Send for SingleThreadPromise<T> {}
#[derive(Default)]
pub struct GlobalContext {
type_cache: SingleThreadPromise<RefCell<TypeCache>>,
call_cache: SingleThreadPromise<RefCell<CallCache>>,
interner: Mutex<string_interner::StringInterner<string_interner::DefaultBackend>>,
}
static GCX: LazyLock<GlobalContext> = LazyLock::new(GlobalContext::default);
pub fn gcx() -> &'static GlobalContext {
&GCX
}
impl GlobalContext {
pub fn with_type_cache<F, T>(&self, f: F) -> T
where
F: FnOnce(&mut TypeCache) -> T,
{
let mut cache = self.type_cache.0.borrow_mut();
f(&mut cache)
}
pub fn with_call_cache<F, T>(&self, f: F) -> T
where
F: FnOnce(&mut CallCache) -> T,
{
let mut cache = self.call_cache.0.borrow_mut();
f(&mut cache)
}
pub fn with_interner<F, T>(&self, f: F) -> T
where
F: FnOnce(&mut string_interner::StringInterner<string_interner::DefaultBackend>) -> T,
{
let mut interner = self.interner.lock().unwrap();
f(&mut interner)
}
}