Macro crossdylib::crossdylib[][src]

macro_rules! crossdylib {
    {
    $($(#[$attr : meta]) * $vis : vis static $ident : ident : $ty : ty = $expr
      : expr ;) +
} => { ... };
}
Expand description

Creates CrossDylibs.

CrossDylibs must be synchronized using the CrossDylib::sync function before use.

Panics

CrossDylibs will panic if accessed before CrossDylib::sync is called in debug mode.

In release mode this will lead to undefined behaviour.

Example

a.dll

#[macro_use] extern crate crossdylib;

crossdylib! {
	static THE_ANSWER: std::sync::Mutex<u32> = std::sync::Mutex::new(39);
}

#[no_mangle]
pub unsafe extern "C" fn increment() {
	THE_ANSWER.sync().unwrap();

	let mut lock = THE_ANSWER.lock().unwrap();
	*lock += 1;
	assert_eq!(*lock, 40);
}

b.dll

#[macro_use] extern crate crossdylib;

crossdylib! {
	static THE_ANSWER: std::sync::Mutex<u32> = std::sync::Mutex::new(39);
}

#[no_mangle]
pub unsafe extern "C" fn increment() {
	THE_ANSWER.sync().unwrap();

	let mut lock = THE_ANSWER.lock().unwrap();
	*lock += 1;
	assert_eq!(*lock, 41);
}

main.exe

fn main() {
	let a = Library::new("a.dll").unwrap();
	a.get::<extern "C" fn()>("increment").unwrap()();

	let b = Library::new("b.dll").unwrap();
	b.get::<extern "C" fn()>("increment").unwrap()();

	println!("Success");
}