From bcc2054da65d769991624956426c8e64ffc037e1 Mon Sep 17 00:00:00 2001 From: Hau Nguyen Date: Sat, 13 Aug 2022 16:46:53 +0700 Subject: [PATCH] fix: fix goroutine leak Fix https://github.com/haunt98/go-test-color/issues/1 Replace goroutine use with more idiomatic usage https://pkg.go.dev/os/exec#Cmd.StdoutPipe https://pkg.go.dev/os/exec#Cmd.StderrPipe --- main.go | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 57293fb..a87e840 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,8 @@ import ( "github.com/fatih/color" ) +const cmdName = "go-test-color" + func main() { code := runGoTest() os.Exit(code) @@ -24,33 +26,33 @@ func runGoTest() int { args = append(args, os.Args[1:]...) cmd := exec.Command("go", args...) - // Output pipe - outReader, outWriter := io.Pipe() - defer outReader.Close() - defer outWriter.Close() + // Read stdout and stderr + outReader, err := cmd.StdoutPipe() + if err != nil { + log.Printf("%s failed to get stdout pipe: %s", cmdName, err) + return 1 + } - // Error pipe - errReader, errWriter := io.Pipe() - defer errReader.Close() - defer errWriter.Close() - - // Redirect cmd pipes to our pipes - cmd.Stdout = outWriter - cmd.Stderr = errWriter + errReader, err := cmd.StderrPipe() + if err != nil { + log.Printf("%s failed to get stderr pipe: %s", cmdName, err) + return 1 + } // See https://stackoverflow.com/questions/8875038/redirect-stdout-pipe-of-child-process-in-go if err := cmd.Start(); err != nil { - log.Printf("Failed to start: %s", err) + log.Printf("%s failed to start: %s", cmdName, err) return 1 } - defer func() { - if err := cmd.Wait(); err != nil { - log.Printf("Failed to wait: %s", err) - } - }() - go colorOutputReader(outReader) - go colorErrorReader(errReader) + // Add color to both stdout and stderr + colorOutputReader(outReader) + colorErrorReader(errReader) + + if err := cmd.Wait(); err != nil { + log.Printf("%s failed to wait: %s", cmdName, err) + return 1 + } return 0 }