diff --git a/crates/runtime/build.rs b/crates/runtime/build.rs index cf9dd5144b..5d618e575f 100644 --- a/crates/runtime/build.rs +++ b/crates/runtime/build.rs @@ -1,7 +1,13 @@ +use std::env; + fn main() { println!("cargo:rerun-if-changed=src/helpers.c"); cc::Build::new() .warnings(true) + .define( + &format!("CFG_TARGET_OS_{}", env::var("CARGO_CFG_TARGET_OS").unwrap()), + None, + ) .file("src/helpers.c") .compile("helpers"); } diff --git a/crates/runtime/src/helpers.c b/crates/runtime/src/helpers.c index 1a7f4946c4..22e3d26211 100644 --- a/crates/runtime/src/helpers.c +++ b/crates/runtime/src/helpers.c @@ -1,11 +1,25 @@ #include +// Note that `sigsetjmp` and `siglongjmp` are used here where possible to +// explicitly pass a 0 argument to `sigsetjmp` that we don't need to preserve +// the process signal mask. This should make this call a bit faster b/c it +// doesn't need to touch the kernel signal handling routines. +#ifdef CFG_TARGET_OS_windows +#define platform_setjmp(buf) setjmp(buf) +#define platform_longjmp(buf, arg) longjmp(buf, arg) +#define platform_jmp_buf jmp_buf +#else +#define platform_setjmp(buf) sigsetjmp(buf, 0) +#define platform_longjmp(buf, arg) siglongjmp(buf, arg) +#define platform_jmp_buf sigjmp_buf +#endif + int RegisterSetjmp( void **buf_storage, void (*body)(void*), void *payload) { - jmp_buf buf; - if (setjmp(buf) != 0) { + platform_jmp_buf buf; + if (platform_setjmp(buf) != 0) { return 0; } *buf_storage = &buf; @@ -14,6 +28,6 @@ int RegisterSetjmp( } void Unwind(void *JmpBuf) { - jmp_buf *buf = (jmp_buf*) JmpBuf; - longjmp(*buf, 1); + platform_jmp_buf *buf = (platform_jmp_buf*) JmpBuf; + platform_longjmp(*buf, 1); }