• Josh Bleecher Snyder's avatar
    runtime/pprof: fix data race between Profile.Add and Profile.WriteTo · 9b15c13d
    Josh Bleecher Snyder authored
    p.m is accessed in WriteTo without holding p.mu.
    Move the access inside the critical section.
    
    The race detector catches this bug using this program:
    
    
    package main
    
    import (
    	"os"
    	"runtime/pprof"
    	"time"
    )
    
    func main() {
    	p := pprof.NewProfile("ABC")
    	go func() {
    		p.WriteTo(os.Stdout, 1)
    		time.Sleep(time.Second)
    	}()
    	p.Add("abc", 0)
    	time.Sleep(time.Second)
    }
    
    
    $ go run -race x.go 
    ==================
    WARNING: DATA RACE
    Write at 0x00c42007c240 by main goroutine:
      runtime.mapassign()
          /Users/josh/go/tip/src/runtime/hashmap.go:485 +0x0
      runtime/pprof.(*Profile).Add()
          /Users/josh/go/tip/src/runtime/pprof/pprof.go:281 +0x255
      main.main()
          /Users/josh/go/tip/src/p.go:15 +0x9d
    
    Previous read at 0x00c42007c240 by goroutine 6:
      runtime/pprof.(*Profile).WriteTo()
          /Users/josh/go/tip/src/runtime/pprof/pprof.go:314 +0xc5
      main.main.func1()
          /Users/josh/go/tip/src/x.go:12 +0x69
    
    Goroutine 6 (running) created at:
      main.main()
          /Users/josh/go/tip/src/x.go:11 +0x6e
    ==================
    ABC profile: total 1
    1 @ 0x110ccb4 0x111aeee 0x1055053 0x107f031
    
    Found 1 data race(s)
    exit status 66
    
    
    (Exit status 66?)
    
    Change-Id: I49d884dc3af9cce2209057a3448fe6bf50653523
    Reviewed-on: https://go-review.googlesource.com/37730
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    9b15c13d
Name
Last commit
Last update
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...