Skip to content

Commit

Permalink
Rollup merge of #38225 - Cobrand:patch-1, r=GuillaumeGomez
Browse files Browse the repository at this point in the history
Update book/ffi to use catch_unwind

r? @GuillaumeGomez

The doc mentioned to spawn a new thread instead of using catch_unwind, which has been the recommended way to catch panics for foreign function interfaces for a few releases now.

This commit fixes that.
  • Loading branch information
GuillaumeGomez authored Dec 7, 2016
2 parents 4fb89b1 + 614b74c commit ef45ec0
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions src/doc/book/ffi.md
Original file line number Diff line number Diff line change
Expand Up @@ -662,26 +662,31 @@ attribute turns off Rust's name mangling, so that it is easier to link to.

It’s important to be mindful of `panic!`s when working with FFI. A `panic!`
across an FFI boundary is undefined behavior. If you’re writing code that may
panic, you should run it in another thread, so that the panic doesn’t bubble up
to C:
panic, you should run it in a closure with [`catch_unwind()`]:

```rust
use std::thread;
use std::panic::catch_unwind;

#[no_mangle]
pub extern fn oh_no() -> i32 {
let h = thread::spawn(|| {
let result = catch_unwind(|| {
panic!("Oops!");
});

match h.join() {
Ok(_) => 1,
Err(_) => 0,
match result {
Ok(_) => 0,
Err(_) => 1,
}
}
# fn main() {}

fn main() {}
```

Please note that [`catch_unwind()`] will only catch unwinding panics, not
those who abort the process. See the documentation of [`catch_unwind()`]
for more information.

[`catch_unwind()`]: https://doc.rust-lang.org/std/panic/fn.catch_unwind.html

# Representing opaque structs

Sometimes, a C library wants to provide a pointer to something, but not let you
Expand Down

0 comments on commit ef45ec0

Please sign in to comment.