wasmer/lib/runtime-core/src/sig_registry.rs

53 lines
1.3 KiB
Rust
Raw Normal View History

2019-01-16 18:26:10 +00:00
use crate::{
structures::Map,
types::{FuncSig, SigIndex},
};
use hashbrown::HashMap;
2019-01-29 18:16:39 +00:00
use lazy_static::lazy_static;
use parking_lot::RwLock;
use std::sync::Arc;
2019-01-08 17:09:47 +00:00
2019-01-29 18:16:39 +00:00
lazy_static! {
static ref GLOBAL_SIG_REGISTRY: RwLock<GlobalSigRegistry> = {
let registry = GlobalSigRegistry {
func_table: HashMap::new(),
sig_assoc: Map::new(),
};
RwLock::new(registry)
};
2019-01-08 17:09:47 +00:00
}
2019-01-29 18:16:39 +00:00
struct GlobalSigRegistry {
func_table: HashMap<Arc<FuncSig>, SigIndex>,
sig_assoc: Map<SigIndex, Arc<FuncSig>>,
}
#[derive(Debug)]
pub struct SigRegistry;
2019-01-08 17:09:47 +00:00
impl SigRegistry {
2019-01-29 20:49:51 +00:00
pub fn lookup_sig_index<Sig>(&self, func_sig: Sig) -> SigIndex
2019-01-29 18:16:39 +00:00
where
Sig: Into<Arc<FuncSig>>,
{
let func_sig = func_sig.into();
let mut global = (*GLOBAL_SIG_REGISTRY).write();
let global = &mut *global;
let func_table = &mut global.func_table;
let sig_assoc = &mut global.sig_assoc;
2019-01-09 02:57:28 +00:00
let sig_index = *func_table
2019-01-29 18:16:39 +00:00
.entry(Arc::clone(&func_sig))
.or_insert_with(|| sig_assoc.push(func_sig));
2019-01-08 17:09:47 +00:00
2019-01-29 18:16:39 +00:00
sig_index
2019-01-08 17:09:47 +00:00
}
2019-01-29 18:16:39 +00:00
pub fn lookup_signature(&self, sig_index: SigIndex) -> Arc<FuncSig> {
let global = (*GLOBAL_SIG_REGISTRY).read();
Arc::clone(&global.sig_assoc[sig_index])
2019-01-08 17:09:47 +00:00
}
}