Как мне сообщить Tokio о событии в ветке, принадлежащей C? - PullRequest
1 голос
/ 11 апреля 2019

Я использую библиотеку C, которая предоставляет API для вызова предоставляемой пользователем функции в потоке, созданном этой библиотекой C.Я не могу обработать события внутри обратного вызова, потому что он не должен блокировать поток, поэтому я хочу каким-то образом сообщить циклу событий Tokio, что мой обратный вызов был вызван.

Как я могу это сделать?

Точнее у меня есть:

fn register_callback_to_run_inside_c_thread<F>(callback_f: F)
where
    F: FnMut() + Send + UnwindSafe + 'static,
{
    unimplemented!();
}

Я хочу передать закрытие внутри register_callback_to_run_inside_c_thread, чтобы проинформировать Токио о событии.

Сначала я попытался:

let (mut tx, rx) = watch::channel("hello");
register_callback_to_run_inside_c_thread(move || {
    tx.broadcast("world").unwrap();
});

Этот код не компилируется, потому что он использует RefCell где-то внутри.

Я также пытался использовать lazy для запуска функции внутри Tokio.Этот код компилируется, но падает во время выполнения, потому что lazy должен выполняться внутри потоков, созданных Tokio, но обратный вызов выполняется внутри потока, созданного библиотекой C.

Есть ли способ сообщить Tokio о событии?

...