Fixed a bug that crashes the program when doing something very specific
It crashed while trying to do Config::default() aka probabbly allocate into the very manually allocated struct (which is bad in rust)
This commit is contained in:
parent
bd40dfe44a
commit
50782cd512
|
@ -1,5 +1,4 @@
|
||||||
|
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod magic;
|
mod magic;
|
||||||
mod c_buffer;
|
mod c_buffer;
|
||||||
|
@ -11,7 +10,7 @@ pub use plugin_info::*;
|
||||||
pub use anyhow::Result;
|
pub use anyhow::Result;
|
||||||
pub use context::*;
|
pub use context::*;
|
||||||
|
|
||||||
pub trait DimPlugin {
|
pub trait DimPlugin: Clone {
|
||||||
fn init(&mut self, ctx: Context);
|
fn init(&mut self, ctx: Context);
|
||||||
fn pre_reload(&mut self);
|
fn pre_reload(&mut self);
|
||||||
fn post_reload(&mut self);
|
fn post_reload(&mut self);
|
||||||
|
|
|
@ -7,7 +7,7 @@ macro_rules! plugin_info {
|
||||||
static ref PLUGIN_INFO: $crate::PluginInfo = $crate::PluginInfo::new($name, $version, $license);
|
static ref PLUGIN_INFO: $crate::PluginInfo = $crate::PluginInfo::new($name, $version, $license);
|
||||||
);
|
);
|
||||||
|
|
||||||
static mut PLUG: *mut $typ = std::ptr::null_mut() as *mut $typ;
|
static mut PLUG: Option<$typ> = None as Option<$typ>;
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_get_info() -> *const std::ffi::c_void {
|
unsafe extern "C" fn plug_get_info() -> *const std::ffi::c_void {
|
||||||
|
@ -16,39 +16,59 @@ macro_rules! plugin_info {
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_init(ctx: *const $crate::ContextRaw) {
|
unsafe extern "C" fn plug_init(ctx: *const $crate::ContextRaw) {
|
||||||
PLUG = std::alloc::alloc(std::alloc::Layout::new::<$typ>()) as *mut $typ;
|
//PLUG = std::alloc::alloc(std::alloc::Layout::new::<$typ>()) as *mut $typ;
|
||||||
*PLUG = Plug::new();
|
PLUG = Some(Plug::new());
|
||||||
|
|
||||||
let ctx = $crate::Context::new(ctx);
|
let ctx = $crate::Context::new(ctx);
|
||||||
(&mut *PLUG).init(ctx);
|
if let Some(p) = &mut PLUG {
|
||||||
|
p.init(ctx)
|
||||||
|
} else {
|
||||||
|
unreachable!();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_pre_reload() -> *mut $typ {
|
unsafe extern "C" fn plug_pre_reload() -> *mut $typ {
|
||||||
//TODO: Untested
|
//TODO: Untested
|
||||||
(&mut *PLUG).pre_reload();
|
if let Some(p) = &mut PLUG {
|
||||||
return PLUG;
|
p.pre_reload();
|
||||||
|
return p as *mut $typ;
|
||||||
|
}
|
||||||
|
unreachable!();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_post_reload(state: *mut $typ) {
|
unsafe extern "C" fn plug_post_reload(state: *mut $typ) {
|
||||||
|
PLUG = Some((*state).clone());
|
||||||
|
|
||||||
|
if let Some(p) = &mut PLUG {
|
||||||
|
p.post_reload();
|
||||||
|
} else {
|
||||||
|
unreachable!();
|
||||||
|
}
|
||||||
//TODO: Untested
|
//TODO: Untested
|
||||||
PLUG = state;
|
|
||||||
(&mut *PLUG).post_reload();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_poll(buf: *mut i8, len: std::ffi::c_uint) {
|
unsafe extern "C" fn plug_poll(buf: *mut i8, len: std::ffi::c_uint) {
|
||||||
let mut buf = $crate::CBuffer::from_raw_parts_mut(buf, len as usize);
|
let mut buf = $crate::CBuffer::from_raw_parts_mut(buf, len as usize);
|
||||||
if let Err(_e) = (&mut *PLUG).poll(&mut buf) {
|
if let Some(p) = &mut PLUG {
|
||||||
// TODO: Handle error maybe?
|
if let Err(_e) = p.poll(&mut buf) {
|
||||||
|
// TODO: Handle error maybe?
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unreachable!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn plug_free() {
|
unsafe extern "C" fn plug_free() {
|
||||||
std::alloc::dealloc(PLUG as *mut u8, std::alloc::Layout::new::<$typ>());
|
if let Some(p) = &mut PLUG {
|
||||||
(&mut *PLUG).free();
|
// std::alloc::dealloc(PLUG as *mut u8, std::alloc::Layout::new::<$typ>());
|
||||||
|
p.free();
|
||||||
|
} else {
|
||||||
|
unreachable!();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user