]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: revert CL 18835; don't install new signal stack unconditionally on dragonfly
authorMikio Hara <mikioh.mikioh@gmail.com>
Wed, 21 Sep 2016 03:53:25 +0000 (12:53 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Wed, 21 Sep 2016 22:18:06 +0000 (22:18 +0000)
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 <iant@golang.org>
src/runtime/os_dragonfly.go

index edf7581bfc14dff2428f1f06709122ad44fa3807..65f98a97f698250da38d0b424256c5f32d3caa5e 100644 (file)
@@ -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