mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: don't try to free OS-created signal stacks
Android's libc creates a signal stack for every thread it creates. In Go, minitSignalStack picks up this existing signal stack and puts it in m.gsignal.stack. However, if we later try to exit a thread (because a locked goroutine is exiting), we'll attempt to stackfree this libc-allocated signal stack and panic. Fix this by clearing gsignal.stack when we unminitSignals in such a situation. This should fix the Android build, which is currently broken. Change-Id: Ieea8d72ef063d22741c54c9daddd8bb84926a488 Reviewed-on: https://go-review.googlesource.com/70130 Reviewed-by: David Crawshaw <crawshaw@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
a3e013b082
commit
44d9e96da9
2 changed files with 11 additions and 1 deletions
|
|
@ -1268,7 +1268,13 @@ func mexit(osStack bool) {
|
|||
unminit()
|
||||
|
||||
// Free the gsignal stack.
|
||||
if m.gsignal != nil {
|
||||
//
|
||||
// If the signal stack was created outside Go, then gsignal
|
||||
// will be non-nil, but unminitSignals set stack.lo to 0
|
||||
// (e.g., Android's libc creates all threads with a signal
|
||||
// stack, so it's possible for Go to exit them but not control
|
||||
// the signal stack).
|
||||
if m.gsignal != nil && m.gsignal.stack.lo != 0 {
|
||||
stackfree(m.gsignal.stack)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue