diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-07-24 17:44:20 +0200 |
|---|---|---|
| committer | Alexander Potapenko <glider@google.com> | 2024-07-24 15:55:05 +0000 |
| commit | d1a1b0ca5ffc870174435e1a6878be98ee02dcd7 (patch) | |
| tree | ec10501ca3eb3e99c86c0f02062cdb735a021cbf /pkg/runtest/run.go | |
| parent | 9726361840e010a0c8acaec8c85c9a1c38c7174a (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/run.go')
| -rw-r--r-- | pkg/runtest/run.go | 9 |
1 files changed, 7 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 { |
