runtime: use typed memmove (write barriers) for chan, map, interface content
Found with GODEBUG=wbshadow=2 mode.
Eventually that will run automatically, but right now
it still detects other missing write barriers.
Change-Id: Iea83d693480c2f3008b4e80d55821acff65970a6
Reviewed-on: https://go-review.googlesource.com/2277
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/runtime/select.go b/src/runtime/select.go
index 1293a15..20dd299 100644
--- a/src/runtime/select.go
+++ b/src/runtime/select.go
@@ -449,7 +449,7 @@
*cas.receivedp = true
}
if cas.elem != nil {
- memmove(cas.elem, chanbuf(c, c.recvx), uintptr(c.elemsize))
+ typedmemmove(c.elemtype, cas.elem, chanbuf(c, c.recvx))
}
memclr(chanbuf(c, c.recvx), uintptr(c.elemsize))
c.recvx++
@@ -477,7 +477,7 @@
racerelease(chanbuf(c, c.sendx))
raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc)
}
- memmove(chanbuf(c, c.sendx), cas.elem, uintptr(c.elemsize))
+ typedmemmove(c.elemtype, chanbuf(c, c.sendx), cas.elem)
c.sendx++
if c.sendx == c.dataqsiz {
c.sendx = 0
@@ -512,7 +512,7 @@
*cas.receivedp = true
}
if cas.elem != nil {
- memmove(cas.elem, sg.elem, uintptr(c.elemsize))
+ typedmemmove(c.elemtype, cas.elem, sg.elem)
}
sg.elem = nil
gp = sg.g
@@ -548,7 +548,7 @@
print("syncsend: sel=", sel, " c=", c, "\n")
}
if sg.elem != nil {
- memmove(sg.elem, cas.elem, uintptr(c.elemsize))
+ typedmemmove(c.elemtype, sg.elem, cas.elem)
}
sg.elem = nil
gp = sg.g