Oops. Bug

This commit is contained in:
Martin Dahl 2019-08-27 17:29:01 +02:00
parent f0597576dc
commit 8ec9d1bedb
2 changed files with 26 additions and 2 deletions

View File

@ -211,13 +211,20 @@ fn untyped_serialize_helper(typename: &str) -> Result<fn(json: serde_json::Value
}
se_helper.push_str(&format!("return Err(())\n}}"));
let mut alloc_helper = format!("fn untyped_alloc_helper(typename: &str) -> Result<*mut std::os::raw::c_void, ()> {{");
for msg in msgs {
alloc_helper.push_str(&generate_untyped_alloc_helper(&msg.module, &msg.prefix, &msg.name));
}
alloc_helper.push_str(&format!("return Err(())\n}}"));
let mut dealloc_helper = format!("fn untyped_dealloc_helper(typename: &str) -> Result<fn(*mut std::os::raw::c_void), ()> {{");
for msg in msgs {
dealloc_helper.push_str(&generate_untyped_dealloc_helper(&msg.module, &msg.prefix, &msg.name));
}
dealloc_helper.push_str(&format!("return Err(())\n}}"));
format!("{} \n\n {} \n\n {} \n\n {} \n\n", ts_helper, ds_helper, se_helper, dealloc_helper)
format!("{} \n\n {} \n\n {} \n\n {} \n\n {} \n\n", ts_helper, ds_helper, se_helper, alloc_helper, dealloc_helper)
}
@ -268,6 +275,19 @@ pub fn generate_untyped_serialize_helper(module_: &str, prefix_: &str, name_: &s
}}", typename = typename, rustname = rustname)
}
pub fn generate_untyped_alloc_helper(module_: &str, prefix_: &str, name_: &str) -> String {
let typename = format!("{}/{}/{}", module_, prefix_, name_);
let rustname = format!("{}::{}::{}", module_, prefix_, name_);
format!("
if typename == \"{typename}\" {{
return Ok({rustname}::create_msg() as *mut std::os::raw::c_void);
}}
", typename = typename, rustname = rustname)
}
pub fn generate_untyped_dealloc_helper(module_: &str, prefix_: &str, name_: &str) -> String {
let typename = format!("{}/{}/{}", module_, prefix_, name_);
let rustname = format!("{}::{}::{}", module_, prefix_, name_);

View File

@ -112,6 +112,7 @@ struct WrappedSubUntyped {
rcl_handle: rcl_subscription_t,
callback: Box<dyn FnMut(serde_json::Value) -> ()>,
serialize: Box<dyn FnMut(*const std::os::raw::c_void) -> serde_json::Value>,
dealloc: Box<dyn FnMut(*mut std::os::raw::c_void) -> ()>,
rcl_msg: *mut std::os::raw::c_void,
}
@ -184,6 +185,7 @@ impl Sub for WrappedSubUntyped
unsafe {
rcl_subscription_fini(&mut self.rcl_handle, node);
}
(self.dealloc)(self.rcl_msg); // manually delete message
}
}
@ -386,12 +388,14 @@ impl Node {
let ts = untyped_ts_helper(topic_type)?;
let de = untyped_deserialize_helper(topic_type)?;
let subscription_handle = self.create_subscription_helper(topic, ts)?;
let dealloc = untyped_dealloc_helper(topic_type)?;
let ws = WrappedSubUntyped {
rcl_handle: subscription_handle,
rcl_msg: unsafe { std_msgs__msg__String__create() as *mut _ as *mut std::os::raw::c_void },
rcl_msg: untyped_alloc_helper(topic_type)?,
callback: callback,
serialize: Box::new(de),
dealloc: Box::new(dealloc),
};
self.subs.push(Box::new(ws));
Ok(self.subs.last().unwrap().handle()) // hmm...