Skip to main content

memlink_runtime/ffi/
symbols.rs

1//! Module symbols - type-safe function pointers for module exports.
2
3use 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}