diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-03-06 23:39:12 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-03-06 23:39:12 +0900 |
| commit | 1e0d68a29e824b25c556d28b6a0cd0c3ab39ffef (patch) | |
| tree | 068a9f2b43dbc56dd82a3758229aa4e8d50f17d8 /internal/pkg/exec.go | |
| parent | 80f2367c163eed8cbbcd1d633514dfea5410744c (diff) | |
internal/pkg: move output buffer to reader
This side is the read end of a pipe and buffering reads from it ended up performing better than buffering one half of the TeeReader (which already goes through the kernel page cache anyway).
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/exec.go')
| -rw-r--r-- | internal/pkg/exec.go | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/internal/pkg/exec.go b/internal/pkg/exec.go index 42831131..eb72ccbd 100644 --- a/internal/pkg/exec.go +++ b/internal/pkg/exec.go @@ -440,28 +440,23 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) { } }() - bw := f.cache.getWriter(status) + brStdout, brStderr := f.cache.getReader(stdout), f.cache.getReader(stderr) stdoutDone, stderrDone := make(chan struct{}), make(chan struct{}) go scanVerbose( msg, cancel, stdoutDone, "("+a.name+":1)", - io.TeeReader(stdout, bw), + io.TeeReader(brStdout, status), ) go scanVerbose( msg, cancel, stderrDone, "("+a.name+":2)", - io.TeeReader(stderr, bw), + io.TeeReader(brStderr, status), ) defer func() { <-stdoutDone <-stderrDone - - flushErr := bw.Flush() - if err == nil { - err = flushErr - } - f.cache.putWriter(bw) - + f.cache.putReader(brStdout) + f.cache.putReader(brStderr) }() } else { z.Stdout, z.Stderr = status, status |
