From f731a20e029f482f8eb13bfb2e8861f1a385ae1e Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 18 May 2026 19:03:11 +0700 Subject: [PATCH] Move sigsetjmp and siglongjmp to setjmp.h --- include/setjmp.h | 2 ++ src/header/setjmp/mod.rs | 14 ++++++++++++-- src/header/signal/mod.rs | 11 +---------- tests/sigsetjmp.c | 1 - 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/include/setjmp.h b/include/setjmp.h index e5167a1203..8b3878d460 100644 --- a/include/setjmp.h +++ b/include/setjmp.h @@ -25,6 +25,8 @@ extern "C" { int setjmp(jmp_buf buf); void longjmp(jmp_buf buf, int value); +int sigsetjmp(jmp_buf buf, int savemask); +int siglongjmp(jmp_buf buf, int savemask); #ifdef __cplusplus } // extern "C" diff --git a/src/header/setjmp/mod.rs b/src/header/setjmp/mod.rs index 3ec61d2b0b..e915bf2091 100644 --- a/src/header/setjmp/mod.rs +++ b/src/header/setjmp/mod.rs @@ -4,6 +4,8 @@ use core::arch::global_asm; +use crate::platform::types::{c_int, c_ulonglong}; + macro_rules! platform_specific { ($($rust_arch:expr,$c_arch:expr,$ext:expr;)+) => { $( @@ -27,7 +29,15 @@ platform_specific! { //Each platform has different sizes for sigjmp_buf, currently only x86_64 is supported unsafe extern "C" { /// See . - pub fn setjmp(jb: *mut u64) -> i32; + pub unsafe fn setjmp(env: *mut c_ulonglong) -> c_int; + /// See . + pub unsafe fn sigsetjmp(env: *mut c_ulonglong, savemask: c_int) -> c_int; /// See . - pub fn longjmp(jb: *mut u64, ret: i32); + pub unsafe fn longjmp(env: *mut c_ulonglong, val: c_int); +} + +/// See . +#[unsafe(no_mangle)] +pub unsafe extern "C" fn siglongjmp(env: *mut c_ulonglong, val: c_int) { + unsafe { longjmp(env, val) }; } diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index 497f6a4d6d..e9f43d1728 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -10,7 +10,7 @@ use cbitset::BitSet; use crate::platform::types::pthread_attr_t; use crate::{ error::{Errno, ResultExt}, - header::{bits_sigset_t::sigset_t, errno, setjmp, time::timespec}, + header::{bits_sigset_t::sigset_t, errno, time::timespec}, platform::{ self, ERRNO, Pal, PalSignal, Sys, types::{c_char, c_int, c_ulonglong, c_void, pid_t, pthread_t, size_t, uid_t}, @@ -129,10 +129,6 @@ pub type siginfo_t = siginfo; /// See pub type stack_t = sigaltstack; -unsafe extern "C" { - pub fn sigsetjmp(jb: *mut c_ulonglong, savemask: c_int) -> c_int; -} - //NOTE for the following two functions, to see why they're implemented slightly differently from their intended behavior, read // https://git.musl-libc.org/cgit/musl/commit/?id=583e55122e767b1586286a0d9c35e2a4027998ab #[unsafe(no_mangle)] @@ -146,11 +142,6 @@ unsafe extern "C" fn __sigsetjmp_tail(jb: *mut c_ulonglong, ret: c_int) -> c_int ret } -#[unsafe(no_mangle)] -pub unsafe extern "C" fn siglongjmp(jb: *mut c_ulonglong, ret: c_int) { - unsafe { setjmp::longjmp(jb, ret) }; -} - /// See . #[unsafe(no_mangle)] pub extern "C" fn kill(pid: pid_t, sig: c_int) -> c_int { diff --git a/tests/sigsetjmp.c b/tests/sigsetjmp.c index 0063d21528..b374ab0a64 100644 --- a/tests/sigsetjmp.c +++ b/tests/sigsetjmp.c @@ -1,6 +1,5 @@ #include #include -#include int main() { sigjmp_buf jb;