• Austin Clements's avatar
    runtime: fix bitmap copying corner-cases · b88276da
    Austin Clements authored
    When an object spans heap arenas, its bitmap is discontiguous, so
    heapBitsSetType unrolls the bitmap into the object itself and then
    copies it out to the real heap bitmap. Unfortunately, since this code
    path is rare, it had two unnoticed bugs related to the head and tail
    of the bitmap:
    
    1. At the head of the object, we were using hbitp as the destination
    bitmap pointer rather than h.bitp, but hbitp points into the
    *temporary* bitmap space (that is, the object itself), so we were
    failing to copy the partial bitmap byte at the head of an object.
    
    2. The core copying loop copied all of the full bitmap bytes, but
    always drove the remaining word count down to 0, even if there was a
    partial bitmap byte for the tail of the object. As a result, we never
    wrote partial bitmap bytes at the tail of an object.
    
    I found these by enabling out-of-place unrolling all the time. To
    improve our chances of detecting these sorts of bugs in the future,
    this CL mimics this by enabling out-of-place mode 50% of the time when
    doubleCheck is enabled so that we test both in-place and out-of-place
    mode.
    
    Change-Id: I69e5d829fb3444be4cf11f4c6d8462c26dc467e8
    Reviewed-on: https://go-review.googlesource.com/110995
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    b88276da
mbitmap.go 65.6 KB