• Russ Cox's avatar
    testing: fix defer race · 4953b872
    Russ Cox authored
    In a test that does
    
            func TestFoo(t *testing.T) {
                    defer cleanup()
                    t.Fatal("oops")
            }
    
    it can be important that cleanup run as the test fails.
    The old code did this in Fatal:
    
            t.signal <- t
            runtime.Goexit()
    
    The runtime.Goexit would run the deferred cleanup
    but the send on t.signal would cause the main test loop
    to move on and possibly even exit the program before
    the runtime.Goexit got a chance to run.
    
    This CL changes tRunner (the top stack frame of a test
    goroutine) to send on t.signal as part of a function
    deferred by the top stack frame.  This delays the send
    on t.signal until after runtime.Goexit has run functions
    deferred by the test itself.
    
    For the above TestFoo, this CL guarantees that cleanup
    will run before the test binary exits.
    
    This is particularly important when cleanup is doing
    externally visible work, like removing temporary files
    or unmounting file systems.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5532078
    4953b872
benchmark.go 7.5 KB