]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: avoid receiving preemotion signal while exec'ing
authorCherry Zhang <cherryyz@google.com>
Thu, 3 Dec 2020 21:53:30 +0000 (16:53 -0500)
committerCherry Zhang <cherryyz@google.com>
Fri, 4 Dec 2020 16:04:44 +0000 (16:04 +0000)
The iOS kernel has the same problem as the macOS kernel. Extend
the workaround of #41702 (CL 262438 and CL 262817) to iOS.

Updates #35851.

Change-Id: I7ccec00dc96643c08c5be8b385394856d0fa0f64
Reviewed-on: https://go-review.googlesource.com/c/go/+/275293
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/proc.go
src/runtime/signal_unix.go

index 0319de5fde8edd044f8d133b26e8468862e0a946..64e102fb0aa19aa19d5a18868b39a36b046eb6b4 100644 (file)
@@ -1363,7 +1363,7 @@ found:
        checkdead()
        unlock(&sched.lock)
 
-       if GOOS == "darwin" {
+       if GOOS == "darwin" || GOOS == "ios" {
                // Make sure pendingPreemptSignals is correct when an M exits.
                // For #41702.
                if atomic.Load(&m.signalPending) != 0 {
@@ -3852,7 +3852,7 @@ func syscall_runtime_BeforeExec() {
 
        // On Darwin, wait for all pending preemption signals to
        // be received. See issue #41702.
-       if GOOS == "darwin" {
+       if GOOS == "darwin" || GOOS == "ios" {
                for int32(atomic.Load(&pendingPreemptSignals)) > 0 {
                        osyield()
                }
index 6aad079f038868bcc8ccbb7ccaf515b6ca637bc2..e8f39c3321f9272cccc5a3cb9a3a38d72f13f526 100644 (file)
@@ -336,7 +336,7 @@ func doSigPreempt(gp *g, ctxt *sigctxt) {
        atomic.Xadd(&gp.m.preemptGen, 1)
        atomic.Store(&gp.m.signalPending, 0)
 
-       if GOOS == "darwin" {
+       if GOOS == "darwin" || GOOS == "ios" {
                atomic.Xadd(&pendingPreemptSignals, -1)
        }
 }
@@ -352,12 +352,12 @@ const preemptMSupported = true
 func preemptM(mp *m) {
        // On Darwin, don't try to preempt threads during exec.
        // Issue #41702.
-       if GOOS == "darwin" {
+       if GOOS == "darwin" || GOOS == "ios" {
                execLock.rlock()
        }
 
        if atomic.Cas(&mp.signalPending, 0, 1) {
-               if GOOS == "darwin" {
+               if GOOS == "darwin" || GOOS == "ios" {
                        atomic.Xadd(&pendingPreemptSignals, 1)
                }
 
@@ -369,7 +369,7 @@ func preemptM(mp *m) {
                signalM(mp, sigPreempt)
        }
 
-       if GOOS == "darwin" {
+       if GOOS == "darwin" || GOOS == "ios" {
                execLock.runlock()
        }
 }
@@ -432,7 +432,7 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
                        // no non-Go signal handler for sigPreempt.
                        // The default behavior for sigPreempt is to ignore
                        // the signal, so badsignal will be a no-op anyway.
-                       if GOOS == "darwin" {
+                       if GOOS == "darwin" || GOOS == "ios" {
                                atomic.Xadd(&pendingPreemptSignals, -1)
                        }
                        return