mirror of
https://github.com/golang/go
synced 2024-11-24 03:40:16 -07:00
src/cmd/go/internal/work: lock Builder output mutex consistently
To prevent interleaving of output when 'go build' compiles several packages in parallel, the output mutex in the Builder struct must be locked around any calls to Builder.Print which could generate arbitrary amounts of text (ie more than is guaranteed to be written atomically to a pipe). Fixes #49987 For #49338 Change-Id: I7947df57667deeff3f03f231824298d823f8a943 Reviewed-on: https://go-review.googlesource.com/c/go/+/369018 Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Trust: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
c27a3592ae
commit
765cc726b6
@ -570,6 +570,8 @@ func showStdout(b *Builder, c *cache.Cache, actionID cache.ActionID, key string)
|
||||
b.Showcmd("", "%s # internal", joinUnambiguously(str.StringList("cat", c.OutputFile(stdoutEntry.OutputID))))
|
||||
}
|
||||
if !cfg.BuildN {
|
||||
b.output.Lock()
|
||||
defer b.output.Unlock()
|
||||
b.Print(string(stdout))
|
||||
}
|
||||
}
|
||||
@ -578,6 +580,8 @@ func showStdout(b *Builder, c *cache.Cache, actionID cache.ActionID, key string)
|
||||
|
||||
// flushOutput flushes the output being queued in a.
|
||||
func (b *Builder) flushOutput(a *Action) {
|
||||
b.output.Lock()
|
||||
defer b.output.Unlock()
|
||||
b.Print(string(a.output))
|
||||
a.output = nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user