From: Austin Clements Date: Thu, 12 May 2016 22:10:03 +0000 (-0400) Subject: runtime: improve heapBitsSetType documentation X-Git-Tag: go1.7beta1~219 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6181db53dbfec513300a236debbdc01735f00c07;p=gostls13.git runtime: improve heapBitsSetType documentation Currently the heapBitsSetType documentation says that there are no races on the heap bitmap, but that isn't exactly true. There are no *write-write* races, but there are read-write races. Expand the documentation to explain this and why it's okay. Change-Id: Ibd92b69bcd6524a40a9dd4ec82422b50831071ed Reviewed-on: https://go-review.googlesource.com/23092 Reviewed-by: Rick Hudson --- diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index 27f8e66d50..ccefbcd8d6 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -847,10 +847,20 @@ func (s *mspan) countFree() int { // malloc does not call heapBitsSetType when there are no pointers, // because all free objects are marked as noscan during // heapBitsSweepSpan. +// // There can only be one allocation from a given span active at a time, -// so this code is not racing with other instances of itself, and -// the bitmap for a span always falls on byte boundaries. -// Hence, it can access the bitmap with racing. +// and the bitmap for a span always falls on byte boundaries, +// so there are no write-write races for access to the heap bitmap. +// Hence, heapBitsSetType can access the bitmap without atomics. +// +// There can be read-write races between heapBitsSetType and things +// that read the heap bitmap like scanobject. However, since +// heapBitsSetType is only used for objects that have not yet been +// made reachable, readers will ignore bits being modified by this +// function. This does mean this function cannot transiently modify +// bits that belong to neighboring objects. Also, on weakly-ordered +// machines, callers must execute a store/store (publication) barrier +// between calling this function and making the object reachable. // // TODO: This still has atomic accesses left over from when it could // race with GC accessing mark bits in the bitmap. Remove these.