This commit is contained in:
vms 2020-04-28 14:47:39 +03:00
parent 91b8baac9a
commit 6c780be3f2

View File

@ -21,8 +21,6 @@ use crate::vm::{config::Config, errors::FrankError, service::FrankService};
use sha2::{digest::generic_array::GenericArray, digest::FixedOutput}; use sha2::{digest::generic_array::GenericArray, digest::FixedOutput};
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::collections::HashMap; use std::collections::HashMap;
use std::os::raw::c_void;
use std::sync::{Arc, Mutex};
use wasmer_runtime::{func, Ctx}; use wasmer_runtime::{func, Ctx};
use wasmer_runtime_core::import::ImportObject; use wasmer_runtime_core::import::ImportObject;
@ -42,30 +40,16 @@ impl Dispatcher {
#[derive(Default)] #[derive(Default)]
pub struct Frank { pub struct Frank {
modules: HashMap<String, FrankModule>, modules: HashMap<String, FrankModule>,
dispatcher: Arc<Mutex<Dispatcher>>, dispatcher: Dispatcher,
} }
impl Frank { impl Frank {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
modules: HashMap::new(), modules: HashMap::new(),
dispatcher: Arc::new(Mutex::new(Dispatcher::new())), dispatcher: Dispatcher::new(),
} }
} }
/*
fn out_invoke(ctx: &mut Ctx, offset: i32, size: i32) -> i32 {
let data = ctx.data as *mut Mutex<Dispatcher>;
let dispatcher: Arc<Mutex<Dispatcher>> = unsafe { Arc::from_raw(data) };
let wasm_ptr = WasmPtr::<u8, Array>::new(offset as _);
match wasm_ptr.get_utf8_string(ctx.memory(0), size as _) {
Some(msg) => print!("{}", msg),
None => print!("frank logger: incorrect UTF8 string's been supplied to logger"),
}
1
}
*/
} }
impl FrankService for Frank { impl FrankService for Frank {
@ -85,19 +69,8 @@ impl FrankService for Frank {
let prepared_wasm_bytes = let prepared_wasm_bytes =
crate::vm::prepare::prepare_module(wasm_bytes, config.mem_pages_count)?; crate::vm::prepare::prepare_module(wasm_bytes, config.mem_pages_count)?;
let dispatcher = self.dispatcher.clone(); let mut import_object = ImportObject::new();
let dispatcher1 = move || { for (module, abi) in self.dispatcher.api.iter() {
let dtor = (|_: *mut c_void| {}) as fn(*mut c_void);
// TODO: try with Box
let dispatcher2: Arc<Mutex<Dispatcher>> = dispatcher.clone();
let raw_dispatcher =
Arc::into_raw(dispatcher2) as *mut Mutex<Dispatcher> as *mut c_void;
(raw_dispatcher, dtor)
};
let mut import_object = ImportObject::new_with_data(dispatcher1);
let dispatcher = self.dispatcher.lock().unwrap();
for (module, abi) in dispatcher.api.iter() {
use wasmer_runtime_core::import::Namespace; use wasmer_runtime_core::import::Namespace;
// TODO: introduce a macro for such things // TODO: introduce a macro for such things
@ -168,8 +141,7 @@ impl FrankService for Frank {
}; };
// registers new abi in a dispatcher // registers new abi in a dispatcher
let mut dispatcher = self.dispatcher.lock().unwrap(); self.dispatcher.api.insert(module_name, module_abi);
dispatcher.api.insert(module_name, module_abi);
Ok(()) Ok(())
} }