mirror of
https://github.com/golang/go
synced 2024-09-25 05:10:12 -06:00
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 <rlh@golang.org>
This commit is contained in:
parent
d8b08c3aa4
commit
6181db53db
@ -847,10 +847,20 @@ func (s *mspan) countFree() int {
|
|||||||
// malloc does not call heapBitsSetType when there are no pointers,
|
// malloc does not call heapBitsSetType when there are no pointers,
|
||||||
// because all free objects are marked as noscan during
|
// because all free objects are marked as noscan during
|
||||||
// heapBitsSweepSpan.
|
// heapBitsSweepSpan.
|
||||||
|
//
|
||||||
// There can only be one allocation from a given span active at a time,
|
// 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
|
// and the bitmap for a span always falls on byte boundaries,
|
||||||
// the bitmap for a span always falls on byte boundaries.
|
// so there are no write-write races for access to the heap bitmap.
|
||||||
// Hence, it can access the bitmap with racing.
|
// 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
|
// TODO: This still has atomic accesses left over from when it could
|
||||||
// race with GC accessing mark bits in the bitmap. Remove these.
|
// race with GC accessing mark bits in the bitmap. Remove these.
|
||||||
|
Loading…
Reference in New Issue
Block a user