• Russ Cox's avatar
    runtime: use type-based write barrier for remote stack write during chansend · 80ec7117
    Russ Cox authored
    A send on an unbuffered channel to a blocked receiver is the only
    case in the runtime where one goroutine writes directly to the stack
    of another. The garbage collector assumes that if a goroutine is
    blocked, its stack contains no new pointers since the last time it ran.
    The send on an unbuffered channel violates this, so it needs an
    explicit write barrier. It has an explicit write barrier, but not one that
    can handle a write to another stack. Use one that can (based on type bitmap
    instead of heap bitmap).
    
    To make this work, raise the limit for type bitmaps so that they are
    used for all types up to 64 kB in size (256 bytes of bitmap).
    (The runtime already imposes a limit of 64 kB for a channel element size.)
    
    I have been unable to reproduce this problem in a simple test program.
    
    Could help #11035.
    
    Change-Id: I06ad994032d8cff3438c9b3eaa8d853915128af5
    Reviewed-on: https://go-review.googlesource.com/10815Reviewed-by: 's avatarAustin Clements <austin@google.com>
    80ec7117
mbitmap.go 55.8 KB