From 7803c8d688b87e3d13f42d543a553201005db783 Mon Sep 17 00:00:00 2001 From: Dave Huseby Date: Wed, 27 Jan 2016 16:46:45 -0800 Subject: [PATCH] refactoring get_stack to be cleaner --- src/libstd/sys/unix/stack_overflow.rs | 47 ++++++++++++--------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index 88ac73de2fb7b..f5353895c9dba 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -140,46 +140,39 @@ mod imp { target_os = "bitrig", target_os = "netbsd", target_os = "openbsd"))] - unsafe fn get_stack() -> *mut libc::c_void { - let stack = mmap(ptr::null_mut(), - SIGSTKSZ, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, - -1, - 0); - if stack == MAP_FAILED { + unsafe fn get_stack() -> libc::stack_t { + let stackp = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - stack + libc::stack_t { ss_sp: stackp, ss_flags: 0, ss_size: SIGSTKSZ } } #[cfg(any(target_os = "dragonfly", target_os = "freebsd"))] - unsafe fn get_stack() -> *mut i8 { - let stack = mmap(ptr::null_mut(), - SIGSTKSZ, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, - -1, - 0); - if stack == MAP_FAILED { + unsafe fn get_stack() -> libc::stack_t { + let stackp = mmap(ptr::null_mut(), + SIGSTKSZ, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0); + if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - stack as *mut i8 + libc::stack_t { ss_sp: stackp as *mut i8, ss_flags: 0, ss_size: SIGSTKSZ } } pub unsafe fn make_handler() -> Handler { - let alt_stack = get_stack(); - let mut stack: libc::stack_t = mem::zeroed(); - - stack.ss_sp = alt_stack; - stack.ss_flags = 0; - stack.ss_size = SIGSTKSZ; - + let stack = get_stack(); sigaltstack(&stack, ptr::null_mut()); - - Handler { _data: alt_stack as *mut libc::c_void } + Handler { _data: stack.ss_sp as *mut libc::c_void } } pub unsafe fn drop_handler(handler: &mut Handler) {