]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: clean up signalstack API
authorAustin Clements <austin@google.com>
Thu, 21 May 2015 18:12:29 +0000 (14:12 -0400)
committerAustin Clements <austin@google.com>
Tue, 2 Jun 2015 19:57:42 +0000 (19:57 +0000)
Currently signalstack takes a lower limit and a length and all calls
hard-code the passed length. Change the API to take a *stack and
compute the lower limit and length from the passed stack.

This will make it easier for the runtime to steal some space from the
top of the stack since it eliminates the hard-coded stack sizes.

Change-Id: I7d2a9f45894b221f4e521628c2165530bbc57d53
Reviewed-on: https://go-review.googlesource.com/10311
Reviewed-by: Rick Hudson <rlh@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/os1_darwin.go
src/runtime/os1_dragonfly.go
src/runtime/os1_freebsd.go
src/runtime/os1_linux.go
src/runtime/os1_netbsd.go
src/runtime/os1_openbsd.go
src/runtime/os3_solaris.go

index 1b74e3e6536c6995762799f63c0e0001d1adaa12..06bc2c79a57cdc6790e986d835f7944c51b9775d 100644 (file)
@@ -138,7 +138,7 @@ func msigsave(mp *m) {
 func minit() {
        // Initialize signal handling.
        _g_ := getg()
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
@@ -155,7 +155,7 @@ func unminit() {
        _g_ := getg()
        smask := (*uint32)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(_SIG_SETMASK, smask, nil)
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 // Mach IPC, to get at semaphores
@@ -454,13 +454,14 @@ func getsig(i int32) uintptr {
        return *(*uintptr)(unsafe.Pointer(&sa.__sigaction_u))
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st stackt
-       st.ss_sp = p
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = (*byte)(unsafe.Pointer(s.lo))
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index eb42b54e2b96a2910072cde0280825c95ff50bc8..a4c11d4fbff19f76a49a0aac9a668714a38aa102 100644 (file)
@@ -136,7 +136,7 @@ func minit() {
        _g_.m.procid = uint64(*(*int32)(unsafe.Pointer(&_g_.m.procid)))
 
        // Initialize signal handling
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
@@ -153,7 +153,7 @@ func unminit() {
        _g_ := getg()
        smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(smask, nil)
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -222,13 +222,14 @@ func getsig(i int32) uintptr {
        return sa.sa_sigaction
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st sigaltstackt
-       st.ss_sp = uintptr(unsafe.Pointer(p))
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = s.lo
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index f7f34bd38685e31ffd027cf5fc1e794a4747e8cc..6dbf8299b4d2509a40702c10043969edc7ddf72c 100644 (file)
@@ -138,7 +138,7 @@ func minit() {
        }
 
        // Initialize signal handling.
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
@@ -155,7 +155,7 @@ func unminit() {
        _g_ := getg()
        smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(smask, nil)
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -224,13 +224,14 @@ func getsig(i int32) uintptr {
        return sa.sa_handler
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st stackt
-       st.ss_sp = uintptr(unsafe.Pointer(p))
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = s.lo
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index 02f98d7c5fdbbc1671d651d33e2584ecea02fb4d..8aa0804860cbdec68bded348ee6470849cd0136f 100644 (file)
@@ -202,7 +202,7 @@ func msigsave(mp *m) {
 func minit() {
        // Initialize signal handling.
        _g_ := getg()
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
@@ -219,7 +219,7 @@ func unminit() {
        _g_ := getg()
        smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask)))
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -311,13 +311,14 @@ func getsig(i int32) uintptr {
        return sa.sa_handler
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st sigaltstackt
-       st.ss_sp = p
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = (*byte)(unsafe.Pointer(s.lo))
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index 3fb05989e7e2ab88d27cd1f5f8fe7dff4e79d6eb..2a579b8694289cc29d5131d3bc23f320ce738d66 100644 (file)
@@ -153,7 +153,7 @@ func minit() {
        _g_.m.procid = uint64(lwp_self())
 
        // Initialize signal handling
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
@@ -171,7 +171,7 @@ func unminit() {
        smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(_SIG_SETMASK, smask, nil)
 
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -213,14 +213,14 @@ func getsig(i int32) uintptr {
        return sa.sa_sigaction
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st sigaltstackt
-
-       st.ss_sp = uintptr(unsafe.Pointer(p))
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = s.lo
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index 5ccf64246869a9a7d718daa8ad4853324b84c65b..c07cd243be53fcd4378258612a24bed9e4c6dd26 100644 (file)
@@ -165,7 +165,7 @@ func minit() {
        _g_.m.procid = uint64(*(*int32)(unsafe.Pointer(&_g_.m.procid)))
 
        // Initialize signal handling
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
@@ -182,7 +182,7 @@ func unminit() {
        _g_ := getg()
        smask := *(*uint32)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(_SIG_SETMASK, smask)
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -224,14 +224,14 @@ func getsig(i int32) uintptr {
        return sa.sa_sigaction
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st stackt
-
-       st.ss_sp = uintptr(unsafe.Pointer(p))
-       st.ss_size = uintptr(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = s.lo
+               st.ss_size = s.hi - s.lo
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }
index e4fe92de4165a21b5be9dc536029d0ae98077514..53d7b96b0f3100c5afd49b51e22efe1dc5b32433 100644 (file)
@@ -203,7 +203,7 @@ func minit() {
        _g_ := getg()
        asmcgocall(unsafe.Pointer(funcPC(miniterrno)), unsafe.Pointer(&libc____errno))
        // Initialize signal handling
-       signalstack((*byte)(unsafe.Pointer(_g_.m.gsignal.stack.lo)), 32*1024)
+       signalstack(&_g_.m.gsignal.stack)
 
        // restore signal mask from m.sigmask and unblock essential signals
        nmask := *(*sigset)(unsafe.Pointer(&_g_.m.sigmask))
@@ -221,7 +221,7 @@ func unminit() {
        smask := (*sigset)(unsafe.Pointer(&_g_.m.sigmask))
        sigprocmask(_SIG_SETMASK, smask, nil)
 
-       signalstack(nil, 0)
+       signalstack(nil)
 }
 
 func memlimit() uintptr {
@@ -286,13 +286,14 @@ func getsig(i int32) uintptr {
        return *((*uintptr)(unsafe.Pointer(&sa._funcptr)))
 }
 
-func signalstack(p *byte, n int32) {
+func signalstack(s *stack) {
        var st sigaltstackt
-       st.ss_sp = (*byte)(unsafe.Pointer(p))
-       st.ss_size = uint64(n)
-       st.ss_flags = 0
-       if p == nil {
+       if s == nil {
                st.ss_flags = _SS_DISABLE
+       } else {
+               st.ss_sp = (*byte)(unsafe.Pointer(s.lo))
+               st.ss_size = uint64(s.hi - s.lo)
+               st.ss_flags = 0
        }
        sigaltstack(&st, nil)
 }