@@ -135,17 +135,42 @@ mod imp {
135135 Handler { _data : MAIN_ALTSTACK } ;
136136 }
137137
138- pub unsafe fn make_handler ( ) -> Handler {
139- let alt_stack = mmap ( ptr:: null_mut ( ) ,
140- SIGSTKSZ ,
141- PROT_READ | PROT_WRITE ,
142- MAP_PRIVATE | MAP_ANON ,
143- -1 ,
144- 0 ) ;
145- if alt_stack == MAP_FAILED {
138+ #[ cfg( any( target_os = "linux" ,
139+ target_os = "macos" ,
140+ target_os = "bitrig" ,
141+ target_os = "netbsd" ,
142+ target_os = "openbsd" ) ) ]
143+ unsafe fn get_stack ( ) -> * mut libc:: c_void {
144+ let stack = mmap ( ptr:: null_mut ( ) ,
145+ SIGSTKSZ ,
146+ PROT_READ | PROT_WRITE ,
147+ MAP_PRIVATE | MAP_ANON ,
148+ -1 ,
149+ 0 ) ;
150+ if stack == MAP_FAILED {
151+ panic ! ( "failed to allocate an alternative stack" ) ;
152+ }
153+ stack
154+ }
155+
156+ #[ cfg( any( target_os = "dragonfly" ,
157+ target_os = "freebsd" ) ) ]
158+ unsafe fn get_stack ( ) -> * mut i8 {
159+ let stack = mmap ( ptr:: null_mut ( ) ,
160+ SIGSTKSZ ,
161+ PROT_READ | PROT_WRITE ,
162+ MAP_PRIVATE | MAP_ANON ,
163+ -1 ,
164+ 0 ) ;
165+ if stack == MAP_FAILED {
146166 panic ! ( "failed to allocate an alternative stack" ) ;
147167 }
168+ stack as * mut i8
169+ }
148170
171+
172+ pub unsafe fn make_handler ( ) -> Handler {
173+ let alt_stack = get_stack ( ) ;
149174 let mut stack: libc:: stack_t = mem:: zeroed ( ) ;
150175
151176 stack. ss_sp = alt_stack;
@@ -154,7 +179,7 @@ mod imp {
154179
155180 sigaltstack ( & stack, ptr:: null_mut ( ) ) ;
156181
157- Handler { _data : alt_stack }
182+ Handler { _data : alt_stack as * mut libc :: c_void }
158183 }
159184
160185 pub unsafe fn drop_handler ( handler : & mut Handler ) {
0 commit comments