Skip to content

Commit

Permalink
runtime: improve heapBitsSetType documentation
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
aclements committed May 14, 2016
1 parent d8b08c3 commit 6181db5
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/runtime/mbitmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 6181db5

Please sign in to comment.