aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/runtest
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-07-24 17:44:20 +0200
committerAlexander Potapenko <glider@google.com>2024-07-24 15:55:05 +0000
commitd1a1b0ca5ffc870174435e1a6878be98ee02dcd7 (patch)
treeec10501ca3eb3e99c86c0f02062cdb735a021cbf /pkg/runtest
parent9726361840e010a0c8acaec8c85c9a1c38c7174a (diff)
pkg/runtest: fix a race during startup
Run method usually runs in a separate goroutine concurrently with request consumer (Next calls), so at least executor needs to be initialized before Run. Otherwise we can get episodic nil derefs in Next method.
Diffstat (limited to 'pkg/runtest')
-rw-r--r--pkg/runtest/run.go9
-rw-r--r--pkg/runtest/run_test.go1
2 files changed, 8 insertions, 2 deletions
diff --git a/pkg/runtest/run.go b/pkg/runtest/run.go
index 501f92dd3..e0fefc31a 100644
--- a/pkg/runtest/run.go
+++ b/pkg/runtest/run.go
@@ -63,13 +63,18 @@ type Context struct {
buildSem chan bool
}
+func (ctx *Context) Init() {
+ // Run usually runs in a separate goroutine concurrently with request consumer (Next calls),
+ // so at least executor needs to be initialized before Run.
+ ctx.executor = queue.DynamicOrder()
+ ctx.buildSem = make(chan bool, runtime.GOMAXPROCS(0))
+}
+
func (ctx *Context) log(msg string, args ...interface{}) {
ctx.LogFunc(fmt.Sprintf(msg, args...))
}
func (ctx *Context) Run(waitCtx context.Context) error {
- ctx.buildSem = make(chan bool, runtime.GOMAXPROCS(0))
- ctx.executor = queue.DynamicOrder()
ctx.generatePrograms()
var ok, fail, broken, skip int
for _, req := range ctx.requests {
diff --git a/pkg/runtest/run_test.go b/pkg/runtest/run_test.go
index 0861b7e2b..d0c3ca780 100644
--- a/pkg/runtest/run_test.go
+++ b/pkg/runtest/run_test.go
@@ -85,6 +85,7 @@ func test(t *testing.T, sysTarget *targets.Target) {
Verbose: true,
Debug: *flagDebug,
}
+ ctx.Init()
waitCtx := startRPCServer(t, target, executor, ctx, rpcParams{
manyProcs: true,
machineChecked: func(features flatrpc.Feature) {