From e9407ae514df7d18e162ce03ebd530fe21aed16d Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Wed, 11 May 2016 10:23:37 -0700 Subject: [PATCH] cmd/pprof: remove tempDir when no longer needed The pprof tools properly cleans up all files it creates, but forgets to clean up the temporary directory itself. This CL fixes that. Fixes #13863 Change-Id: I1151c36cdad5ace7cc97e7e04001cf0149ef0f63 Reviewed-on: https://go-review.googlesource.com/23019 Reviewed-by: Brad Fitzpatrick Run-TryBot: Joe Tsai TryBot-Result: Gobot Gobot --- src/cmd/internal/pprof/commands/commands.go | 1 + src/cmd/internal/pprof/tempfile/tempfile.go | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cmd/internal/pprof/commands/commands.go b/src/cmd/internal/pprof/commands/commands.go index 5018c02af18..5dfbbd4a5dc 100644 --- a/src/cmd/internal/pprof/commands/commands.go +++ b/src/cmd/internal/pprof/commands/commands.go @@ -197,6 +197,7 @@ func makeVizTmpDir() error { if err != nil { return err } + tempfile.DeferDelete(name) vizTmpDir = name return nil } diff --git a/src/cmd/internal/pprof/tempfile/tempfile.go b/src/cmd/internal/pprof/tempfile/tempfile.go index 31c117690a1..a5706345e43 100644 --- a/src/cmd/internal/pprof/tempfile/tempfile.go +++ b/src/cmd/internal/pprof/tempfile/tempfile.go @@ -27,18 +27,19 @@ func New(dir, prefix, suffix string) (*os.File, error) { var tempFiles []string var tempFilesMu = sync.Mutex{} -// DeferDelete marks a file to be deleted by next call to Cleanup() +// DeferDelete marks a file or directory to be deleted by next call to Cleanup. func DeferDelete(path string) { tempFilesMu.Lock() tempFiles = append(tempFiles, path) tempFilesMu.Unlock() } -// Cleanup removes any temporary files selected for deferred cleaning. +// Cleanup removes any temporary files or directories selected for deferred cleaning. +// Similar to defer semantics, the nodes are deleted in LIFO order. func Cleanup() { tempFilesMu.Lock() - for _, f := range tempFiles { - os.Remove(f) + for i := len(tempFiles) - 1; i >= 0; i-- { + os.Remove(tempFiles[i]) } tempFiles = nil tempFilesMu.Unlock()