Commit f045ca8d authored by Elias Naur's avatar Elias Naur

misc/ios: serialize iOS execution

The iOS exec wrapper use complicated machinery to run a iOS binary
on a device.
Running several binaries concurrently doesn't work (reliably), which
can break tests running concurrently. For my setup, the
runtime:cpu124 and sync_cpu tests can't run reliably without one of them
crashing.

Add a file lock to the exec wrapper to serialize execution.

Fixes #14318 (for me)

Change-Id: I023610e014b327f8d66f1d2fd2e54dd0e56f2be0
Reviewed-on: https://go-review.googlesource.com/21074Reviewed-by: default avatarDavid Crawshaw <crawshaw@golang.org>
parent fc435895
...@@ -34,6 +34,7 @@ import ( ...@@ -34,6 +34,7 @@ import (
"runtime" "runtime"
"strings" "strings"
"sync" "sync"
"syscall"
"time" "time"
) )
...@@ -76,6 +77,20 @@ func main() { ...@@ -76,6 +77,20 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
// This wrapper uses complicated machinery to run iOS binaries. It
// works, but only when running one binary at a time.
// Use a file lock to make sure only one wrapper is running at a time.
//
// The lock file is never deleted, to avoid concurrent locks on distinct
// files with the same path.
lockName := filepath.Join(os.TempDir(), "go_darwin_arm_exec.lock")
lock, err := os.OpenFile(lockName, os.O_CREATE|os.O_RDONLY, 0666)
if err != nil {
log.Fatal(err)
}
if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil {
log.Fatal(err)
}
// Approximately 1 in a 100 binaries fail to start. If it happens, // Approximately 1 in a 100 binaries fail to start. If it happens,
// try again. These failures happen for several reasons beyond // try again. These failures happen for several reasons beyond
// our control, but all of them are safe to retry as they happen // our control, but all of them are safe to retry as they happen
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment