diff options
Diffstat (limited to 'src/runtime/testdata')
| -rw-r--r-- | src/runtime/testdata/testprog/checkfinalizers.go | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/runtime/testdata/testprog/checkfinalizers.go b/src/runtime/testdata/testprog/checkfinalizers.go index ea352a4e3e..9f082a25ff 100644 --- a/src/runtime/testdata/testprog/checkfinalizers.go +++ b/src/runtime/testdata/testprog/checkfinalizers.go @@ -28,17 +28,40 @@ func DetectFinalizerAndCleanupLeaks() { // Leak a cleanup. cLeak := new(T) + + // Use an extra closure to avoid the simple + // checking done by AddCleanup. + var closeOverCLeak func(int) + closeOverCLeak = func(x int) { + // Use recursion to avoid inlining. + if x <= 0 { + **cLeak = x + } else { + closeOverCLeak(x - 1) + } + } + runtime.AddCleanup(cLeak, func(x int) { - **cLeak = x + closeOverCLeak(x) }, int(0)) // Have a regular cleanup to make sure it doesn't trip the detector. cNoLeak := new(T) runtime.AddCleanup(cNoLeak, func(_ int) {}, int(0)) + // Like closeOverCLeak. + var closeOverCNoLeak func(int) + closeOverCNoLeak = func(x int) { + if x <= 0 { + **cNoLeak = x + } else { + closeOverCNoLeak(x - 1) + } + } + // Add a cleanup that only temporarily leaks cNoLeak. runtime.AddCleanup(cNoLeak, func(x int) { - **cNoLeak = x + closeOverCNoLeak(x) }, int(0)).Stop() if !asan.Enabled && !race.Enabled { |
