]> Cypherpunks repositories - gostls13.git/commit
runtime: perform write barriers on direct channel receive
authorAustin Clements <austin@google.com>
Mon, 31 Oct 2016 21:37:05 +0000 (17:37 -0400)
committerAustin Clements <austin@google.com>
Mon, 31 Oct 2016 23:46:13 +0000 (23:46 +0000)
commitf2d05389da562fd58143995195b5f6f844eb89e1
treea87f8ec62bfd253b6601cbccff123f56b9332b12
parent9a8bf2d67de6884d99760a065d7af508b85e38d7
runtime: perform write barriers on direct channel receive

Currently we have write barriers for direct channel sends, where the
receiver is blocked and the sender is writing directly to the
receiver's stack; but not for direct channel receives, where the
sender is blocked and the receiver is reading directly from the
sender's stack.

This was okay with the old write barrier because either 1) the
receiver would write the received pointer into the heap (causing it to
be shaded), 2) the pointer would still be on the receiver's stack at
mark termination and we would rescan it, or 3) the receiver dropped
the pointer so it wasn't necessarily reachable anyway.

This is not okay with the write barrier because it lets a grey stack
send a white pointer to a black stack and then remove it from its own
stack. If the grey stack was the sole grey-protector of this pointer,
this hides the object from the garbage collector.

Fix this by making direct receives perform a stack-to-stack write
barrier just like direct sends do.

Fixes #17694.

Change-Id: I1a4cb904e4138d2ac22f96a3e986635534a5ae41
Reviewed-on: https://go-review.googlesource.com/32450
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/chan.go