summaryrefslogtreecommitdiff
path: root/src/cmd/pprof/internal/tempfile/tempfile.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/pprof/internal/tempfile/tempfile.go')
-rw-r--r--src/cmd/pprof/internal/tempfile/tempfile.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/cmd/pprof/internal/tempfile/tempfile.go b/src/cmd/pprof/internal/tempfile/tempfile.go
new file mode 100644
index 000000000..31c117690
--- /dev/null
+++ b/src/cmd/pprof/internal/tempfile/tempfile.go
@@ -0,0 +1,45 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package tempfile provides tools to create and delete temporary files
+package tempfile
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "sync"
+)
+
+// New returns an unused filename for output files.
+func New(dir, prefix, suffix string) (*os.File, error) {
+ for index := 1; index < 10000; index++ {
+ path := filepath.Join(dir, fmt.Sprintf("%s%03d%s", prefix, index, suffix))
+ if _, err := os.Stat(path); err != nil {
+ return os.Create(path)
+ }
+ }
+ // Give up
+ return nil, fmt.Errorf("could not create file of the form %s%03d%s", prefix, 1, suffix)
+}
+
+var tempFiles []string
+var tempFilesMu = sync.Mutex{}
+
+// DeferDelete marks a file 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.
+func Cleanup() {
+ tempFilesMu.Lock()
+ for _, f := range tempFiles {
+ os.Remove(f)
+ }
+ tempFiles = nil
+ tempFilesMu.Unlock()
+}