@@ -33,85 +33,91 @@ func cpuStrategyFn(p *Profiler) (FinalizerFunc, error) {
3333 if err := pprof .StartCPUProfile (p .profileFile ); err != nil {
3434 return nil , err
3535 }
36- return func () {
36+ return func () (err error ) {
37+ defer func () { err = p .profileFile .Close () }()
3738 pprof .StopCPUProfile ()
38- p . profileFile . Close ()
39+ return nil
3940 }, nil
4041}
4142
4243func heapStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
4344 rate := runtime .MemProfileRate
4445 p .SetProfileFile (MemoryFileName )
4546 runtime .MemProfileRate = p .memoryProfileRate
46- return func () {
47+ return func () (err error ) {
48+ defer func () { runtime .MemProfileRate = rate }()
49+ defer func () { err = p .profileFile .Close () }()
4750 _ = pprof .Lookup (heapProfileName ).WriteTo (p .profileFile , 0 )
4851 runtime .GC ()
49- p .profileFile .Close ()
50- runtime .MemProfileRate = rate
52+ return nil
5153 }, nil
5254}
5355
5456func allocStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
5557 rate := runtime .MemProfileRate
5658 p .SetProfileFile (MemoryFileName )
5759 runtime .MemProfileRate = p .memoryProfileRate
58- return func () {
60+ return func () (err error ) {
61+ defer func () { runtime .MemProfileRate = rate }()
62+ defer func () { err = p .profileFile .Close () }()
5963 _ = pprof .Lookup (allocProfileName ).WriteTo (p .profileFile , 0 )
6064 runtime .GC ()
61- p .profileFile .Close ()
62- runtime .MemProfileRate = rate
65+ return nil
6366 }, nil
6467}
6568
6669func mutexStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
6770 p .SetProfileFile (MutexFileName )
6871 _ = pprof .Lookup ("mutex" ).WriteTo (p .profileFile , 0 )
69- return func () {
70- p .profileFile .Close ()
72+ return func () error {
73+ return p .profileFile .Close ()
7174 }, nil
7275}
7376
7477func blockStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
7578 p .SetProfileFile (BlockFileName )
7679 // for now, we do not allow customising the runtime.SetBlockProfileRate
7780 // if it is useful in future, change is welcome here.
78- return func () {
81+ return func () error {
82+ defer runtime .SetBlockProfileRate (0 )
7983 _ = pprof .Lookup ("block" ).WriteTo (p .profileFile , 0 )
80- p .profileFile .Close ()
81- runtime .SetBlockProfileRate (0 )
84+ return p .profileFile .Close ()
8285 }, nil
8386}
8487
8588func goroutineStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
8689 p .SetProfileFile (GoroutineFileName )
8790 _ = pprof .Lookup ("goroutine" ).WriteTo (p .profileFile , 0 )
88- return func () {
89- p .profileFile .Close ()
91+ return func () error {
92+ return p .profileFile .Close ()
9093 }, nil
9194}
9295
9396func threadCreateStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
9497 p .SetProfileFile (ThreadCreateFileName )
95- return func () {
98+ return func () (err error ) {
99+ defer func () { err = p .profileFile .Close () }()
96100 _ = pprof .Lookup ("threadcreate" ).WriteTo (p .profileFile , 0 )
97- p . profileFile . Close ()
101+ return nil
98102 }, nil
99103}
100104
101105func traceStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
102106 p .SetProfileFile (TraceFileName )
103- trace .Start (p .profileFile )
104- return func () {
105- p .profileFile .Close ()
107+ if err := trace .Start (p .profileFile ); err != nil {
108+ return nil , err
109+ }
110+ return func () error {
106111 trace .Stop ()
112+ return nil
107113 }, nil
108114}
109115
110116func clockStrategyFn (p * Profiler ) (FinalizerFunc , error ) {
111117 p .SetProfileFile (ClockFileName )
112118 teardown := fgprof .Start (p .profileFile , fgprof .FormatPprof )
113- return func () {
114- teardown ()
115- p . profileFile . Close ()
119+ return func () ( err error ) {
120+ defer func () { err = p . profileFile . Close () } ()
121+ return teardown ()
116122 }, nil
117123}
0 commit comments