From: Mikio Hara Date: Wed, 21 Sep 2016 03:53:25 +0000 (+0900) Subject: runtime: revert CL 18835; don't install new signal stack unconditionally on dragonfly X-Git-Tag: go1.8beta1~1201 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5db80c30e6b360ef18159332b3ff19234f911f36;p=gostls13.git runtime: revert CL 18835; don't install new signal stack unconditionally on dragonfly This change reverts CL 18835 which is a workaroud for older DragonFly BSD kernels, and fixes #14051, #14052 and #14067 in a more general way the same as other platforms except NetBSD. This change also bumps the minimum required version of DragonFly BSD kernel to 4.4.4. Fixes #16329. Change-Id: I0b44b6afa675f5ed9523914226bd9ec4809ba5ae Reviewed-on: https://go-review.googlesource.com/29491 Reviewed-by: Ian Lance Taylor --- diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index edf7581bfc..65f98a97f6 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -201,16 +201,21 @@ func minit() { _g_.m.procid = uint64(*(*int32)(unsafe.Pointer(&_g_.m.procid))) // Initialize signal handling. - - // On DragonFly a thread created by pthread_create inherits - // the signal stack of the creating thread. We always create - // a new signal stack here, to avoid having two Go threads - // using the same signal stack. This breaks the case of a - // thread created in C that calls sigaltstack and then calls a - // Go function, because we will lose track of the C code's - // sigaltstack, but it's the best we can do. - signalstack(&_g_.m.gsignal.stack) - _g_.m.newSigstack = true + var st sigaltstackt + sigaltstack(nil, &st) + if st.ss_flags&_SS_DISABLE != 0 { + signalstack(&_g_.m.gsignal.stack) + _g_.m.newSigstack = true + } else { + // Use existing signal stack. + stsp := uintptr(unsafe.Pointer(st.ss_sp)) + _g_.m.gsignal.stack.lo = stsp + _g_.m.gsignal.stack.hi = stsp + st.ss_size + _g_.m.gsignal.stackguard0 = stsp + _StackGuard + _g_.m.gsignal.stackguard1 = stsp + _StackGuard + _g_.m.gsignal.stackAlloc = st.ss_size + _g_.m.newSigstack = false + } // restore signal mask from m.sigmask and unblock essential signals nmask := _g_.m.sigmask