Я создаю безопасные привязки для библиотеки 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
для такой структуры, чтобы я мог безопасно разделить ее между потоками?
Если кто-то хочет проверить полный код библиотеки, вот ссылка