Как безопасно обернуть указатели C в структуры ржавчины
Я создаю безопасные привязки для библиотеки C в Rust, и у меня возникла странная проблема.
Я создал структуру, чтобы владеть небезопасным указателем на объекты, возвращаемые библиотекой, и безопасно их освобождать.
Вот что у меня есть:
pub struct VipsImage {
pub(crate) ctx: *mut bindings::VipsImage,
}
impl Drop for VipsImage {
fn drop(&mut self) {
unsafe {
if !self.ctx.is_null() {
bindings::g_object_unref(self.ctx as *mut c_void);
}
}
}
}
Это отлично работает, пока я не делюсь этим между async
звонки. Если я верну один из этих объектов вasync
функция и использовать ее, после этого она будет повреждена. Если я использовал и освободил их за одну операцию, они работали должным образом. Как бы я реализовалSend
а также Sync
для такой структуры, чтобы я мог безопасно делиться ею между потоками?
Если кто-то хочет проверить полный код библиотеки, вот ссылка