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

Если кто-то хочет проверить полный код библиотеки, вот ссылка

0 ответов

Другие вопросы по тегам