Как безопасно обернуть C указатели в ржавчины - PullRequest
0 голосов
/ 03 февраля 2020

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...