Как создать безопасные привязки FFI для библиотеки, ресурсы которой могут быть признаны недействительными в любое время?

Я пытаюсь создать композитор Wayland на Rust. Wayland является преемником оконной системы X11. Одна из наиболее полнофункциональных библиотек для разработки Wayland называется wlroots и написана на / для C.I Раньше я использовал его немного, но в C. К сожалению, похоже, что создание безопасных привязок Rust будет затруднено.

Автор находящегося в архиве проекта Way-Cooler попытался создать безопасные привязки, но имел чрезвычайно трудное время, и в конце концов отказался от этого.

Основная проблема, по-видимому, заключается в том, что «ресурсы» Wayland - такие как клавиатуры и подключения мониторов - могут быть удалены пользователем в любое время, просто отсоединив видеокабель. Wayland отправляет обратный вызов, когда это происходит, но такая память, которая может быть просто удалена в любой момент, очевидно, небезопасна и не разрешена Rust.

Раньше я кодировал на Rust, но я не эксперт в управлении памятью или всех инструментах, которые Rust предоставляет в ящиках std / non-std, чтобы помочь с этим. Как я могу реализовать это, надеюсь, более элегантным / простым способом, чем предыдущие попытки сделать то же самое?


person coder.kalyan    schedule 15.04.2020    source источник
comment
Сообщение в блоге показывает путь, которым я бы пошел: иметь семантику, подобную слабому указателю, которая проверяется на достоверность и обновляется до ссылок, а затем передает ссылку в остальной код. Все остальное, вероятно, небезопасно для памяти.   -  person Shepmaster    schedule 15.04.2020
comment
@Shepmaster, это все еще небезопасно; устройство может быть отключено от сети, пока вы заимствуете ссылку. Я думаю, что единственный безопасный способ - изолировать возможный UB в его собственном процессе, который вы можете убить, когда получите обратный вызов.   -  person Peter Hall    schedule 16.04.2020
comment
@PeterHall Я полагаю, это зависит от того, как реализована библиотека C. Он может иметь очередь сообщений от ОС и обрабатывать их только в известных точках (например, в начале цикла событий, как указано в сообщении в блоге). Если отключить в середине, любые оставшиеся команды могут просто уйти в эфир, но не вызовут небезопасности памяти.   -  person Shepmaster    schedule 16.04.2020
comment
@Shepmaster правда. На этот вопрос нельзя правильно ответить, не зная детальной реализации библиотеки C.   -  person Peter Hall    schedule 16.04.2020
comment
Думаю, на ваш вопрос отвечает stackoverflow.com/q/61106587/155423   -  person Shepmaster    schedule 16.04.2020