mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: use type-based write barrier for remote stack write during chansend
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/10815 Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
d14e9e6323
commit
80ec711755
5 changed files with 88 additions and 24 deletions
|
|
@ -1797,6 +1797,9 @@ func SliceOf(t Type) Type {
|
|||
return cachePut(ckey, &slice.rtype)
|
||||
}
|
||||
|
||||
// See cmd/compile/internal/gc/reflect.go for derivation of constant.
|
||||
const maxPtrmaskBytes = 2048
|
||||
|
||||
// ArrayOf returns the array type with the given count and element type.
|
||||
// For example, if t represents int, ArrayOf(5, t) represents [5]int.
|
||||
//
|
||||
|
|
@ -1865,7 +1868,7 @@ func ArrayOf(count int, elem Type) Type {
|
|||
array.gcdata = typ.gcdata
|
||||
array.ptrdata = typ.ptrdata
|
||||
|
||||
case typ.kind&kindGCProg == 0 && array.size <= 16*8*ptrSize:
|
||||
case typ.kind&kindGCProg == 0 && array.size <= maxPtrmaskBytes*8*ptrSize:
|
||||
// Element is small with pointer mask; array is still small.
|
||||
// Create direct pointer mask by turning each 1 bit in elem
|
||||
// into count 1 bits in larger mask.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue