Android: паника не проходит через границу SDL_main
catch_unwind вокруг запуска клиента: аддон или драйвер не должны ронять процесс через FFI-барьер (правило AGENTS.md №2).
This commit is contained in:
parent
8d572b8190
commit
b28d6f9f25
1 changed files with 14 additions and 3 deletions
|
|
@ -215,11 +215,22 @@ pub unsafe extern "C" fn SDL_main(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match run(args) {
|
match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| run(args))) {
|
||||||
Ok(()) => 0,
|
Ok(Ok(())) => 0,
|
||||||
Err(err) => {
|
Ok(Err(err)) => {
|
||||||
tracing::error!("{err:#}");
|
tracing::error!("{err:#}");
|
||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
Err(payload) => {
|
||||||
|
// Паника не должна проходить через FFI-границу SDL: ловим её и
|
||||||
|
// отдаём код ошибки, как того требует правило проекта.
|
||||||
|
let message = payload
|
||||||
|
.downcast_ref::<&str>()
|
||||||
|
.copied()
|
||||||
|
.or_else(|| payload.downcast_ref::<String>().map(String::as_str))
|
||||||
|
.unwrap_or("неизвестная паника");
|
||||||
|
tracing::error!("паника в SDL_main: {message}");
|
||||||
|
2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue