]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix write-barrier-enabled phase list in gcmarkwb_m
authorAustin Clements <austin@google.com>
Mon, 8 Jun 2015 00:13:21 +0000 (20:13 -0400)
committerAustin Clements <austin@google.com>
Mon, 8 Jun 2015 05:13:15 +0000 (05:13 +0000)
Commit 1303957 was supposed to enable write barriers during the
concurrent scan phase, but it only enabled *calls* to the write
barrier during this phase. It failed to update the redundant list of
write-barrier-enabled phases in gcmarkwb_m, so it still wasn't greying
objects during the scan phase.

This commit fixes this by replacing the redundant list of phases in
gcmarkwb_m with simply checking writeBarrierEnabled. This is almost
certainly redundant with checks already done in callers, but the last
time we tried to remove these redundant checks everything got much
slower, so I'm leaving it alone for now.

Fixes #11105.

Change-Id: I00230a3cb80a008e749553a8ae901b409097e4be
Reviewed-on: https://go-review.googlesource.com/10801
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: Minux Ma <minux@golang.org>
src/runtime/mbarrier.go

index 674160cb3ac35e361539e3541765311b1a5a2d6c..95ee2ab672df061922b591768a423eb6d284205f 100644 (file)
@@ -72,14 +72,7 @@ import "unsafe"
 // so it depends on write barriers to track changes to pointers in
 // stack frames that have not been active. go:nowritebarrier
 func gcmarkwb_m(slot *uintptr, ptr uintptr) {
-       switch gcphase {
-       default:
-               throw("gcphasework in bad gcphase")
-
-       case _GCoff, _GCstw, _GCsweep, _GCscan:
-               // ok
-
-       case _GCmark, _GCmarktermination:
+       if writeBarrierEnabled {
                if ptr != 0 && inheap(ptr) {
                        shade(ptr)
                }