mirror of
https://github.com/golang/go
synced 2024-11-18 17:54:57 -07:00
runtime: avoid staticinit dependency with sigsetAllExiting
Currently, package runtime runs `osinit` before dynamic initialization of package-scope variables; but on GOOS=linux, `osinit` involves mutating `sigsetAllExiting`. This currently works because cmd/compile and gccgo have non-spec-conforming optimizations that statically initialize `sigsetAllExiting`, but disabling that optimization causes `sigsetAllExiting` to be dynamically initialized instead. This in turn causes the mutations in `osinit` to get lost. This CL moves the initialization of `sigsetAllExiting` from `osinit` into its initialization expression, and then removes the special case for continuing to perform the static-initialization optimization for package runtime. Updates #51913. Change-Id: I3be31454277c103372c9701d227dc774b2311dad Reviewed-on: https://go-review.googlesource.com/c/go/+/405549 Auto-Submit: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Heschi Kreinick <heschi@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
3556d3b9bf
commit
1cdabf0c8b
@ -346,24 +346,6 @@ func getHugePageSize() uintptr {
|
||||
func osinit() {
|
||||
ncpu = getproccount()
|
||||
physHugePageSize = getHugePageSize()
|
||||
if iscgo {
|
||||
// #42494 glibc and musl reserve some signals for
|
||||
// internal use and require they not be blocked by
|
||||
// the rest of a normal C runtime. When the go runtime
|
||||
// blocks...unblocks signals, temporarily, the blocked
|
||||
// interval of time is generally very short. As such,
|
||||
// these expectations of *libc code are mostly met by
|
||||
// the combined go+cgo system of threads. However,
|
||||
// when go causes a thread to exit, via a return from
|
||||
// mstart(), the combined runtime can deadlock if
|
||||
// these signals are blocked. Thus, don't block these
|
||||
// signals when exiting threads.
|
||||
// - glibc: SIGCANCEL (32), SIGSETXID (33)
|
||||
// - musl: SIGTIMER (32), SIGCANCEL (33), SIGSYNCCALL (34)
|
||||
sigdelset(&sigsetAllExiting, 32)
|
||||
sigdelset(&sigsetAllExiting, 33)
|
||||
sigdelset(&sigsetAllExiting, 34)
|
||||
}
|
||||
osArchInit()
|
||||
}
|
||||
|
||||
|
@ -1177,10 +1177,34 @@ func msigrestore(sigmask sigset) {
|
||||
}
|
||||
|
||||
// sigsetAllExiting is used by sigblock(true) when a thread is
|
||||
// exiting. sigset_all is defined in OS specific code, and per GOOS
|
||||
// behavior may override this default for sigsetAllExiting: see
|
||||
// osinit().
|
||||
var sigsetAllExiting = sigset_all
|
||||
// exiting.
|
||||
var sigsetAllExiting = func() sigset {
|
||||
res := sigset_all
|
||||
|
||||
// Apply GOOS-specific overrides here, rather than in osinit,
|
||||
// because osinit may be called before sigsetAllExiting is
|
||||
// initialized (#51913).
|
||||
if GOOS == "linux" && iscgo {
|
||||
// #42494 glibc and musl reserve some signals for
|
||||
// internal use and require they not be blocked by
|
||||
// the rest of a normal C runtime. When the go runtime
|
||||
// blocks...unblocks signals, temporarily, the blocked
|
||||
// interval of time is generally very short. As such,
|
||||
// these expectations of *libc code are mostly met by
|
||||
// the combined go+cgo system of threads. However,
|
||||
// when go causes a thread to exit, via a return from
|
||||
// mstart(), the combined runtime can deadlock if
|
||||
// these signals are blocked. Thus, don't block these
|
||||
// signals when exiting threads.
|
||||
// - glibc: SIGCANCEL (32), SIGSETXID (33)
|
||||
// - musl: SIGTIMER (32), SIGCANCEL (33), SIGSYNCCALL (34)
|
||||
sigdelset(&res, 32)
|
||||
sigdelset(&res, 33)
|
||||
sigdelset(&res, 34)
|
||||
}
|
||||
|
||||
return res
|
||||
}()
|
||||
|
||||
// sigblock blocks signals in the current thread's signal mask.
|
||||
// This is used to block signals while setting up and tearing down g
|
||||
|
Loading…
Reference in New Issue
Block a user