memlink_runtime/ffi/
symbols.rs1use libloading::Symbol;
4use std::marker::PhantomData;
5use std::sync::Arc;
6
7pub type ModuleInitFn = unsafe extern "C" fn(config: *const u8, config_len: usize) -> i32;
8
9pub type ModuleCallFn =
10 unsafe extern "C" fn(method_id: u32, args: *const u8, args_len: usize, output: *mut u8) -> i32;
11
12pub type ModuleShutdownFn = unsafe extern "C" fn() -> i32;
13
14#[derive(Clone)]
15pub struct LibHandle {
16 inner: Arc<libloading::Library>,
17}
18
19impl LibHandle {
20 pub(crate) fn new(inner: libloading::Library) -> Self {
21 LibHandle {
22 inner: Arc::new(inner),
23 }
24 }
25
26 pub(crate) fn inner(&self) -> &libloading::Library {
27 &self.inner
28 }
29}
30
31pub struct ModuleSymbols<'lib> {
32 pub memlink_init: Symbol<'lib, ModuleInitFn>,
33 pub memlink_call: Symbol<'lib, ModuleCallFn>,
34 pub memlink_shutdown: Symbol<'lib, ModuleShutdownFn>,
35 _marker: PhantomData<&'lib LibHandle>,
36}
37
38impl<'lib> ModuleSymbols<'lib> {
39 pub fn new(
40 memlink_init: Symbol<'lib, ModuleInitFn>,
41 memlink_call: Symbol<'lib, ModuleCallFn>,
42 memlink_shutdown: Symbol<'lib, ModuleShutdownFn>,
43 ) -> Self {
44 ModuleSymbols {
45 memlink_init,
46 memlink_call,
47 memlink_shutdown,
48 _marker: PhantomData,
49 }
50 }
51}