From: Rick Hudson Date: Tue, 24 Mar 2015 15:18:46 +0000 (-0400) Subject: runtime: Remove write barrier on g X-Git-Tag: go1.5beta1~1451 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=546a54bb2e96f9561e71acf5e70df466056aefaf;p=gostls13.git runtime: Remove write barrier on g There are calls to stdcall when the GC thinks the world is stopped and stdcall write a *g for the CPU profiler. This produces a write barrier but the GC is not prepared to deal with write barriers when it thinks the world is stopped. Since the g is on allg it does not need a write barrier to keep it alive so eliminate the write barrier. Change-Id: I937633409a66553d7d292d87d7d58caba1fad0b6 Reviewed-on: https://go-review.googlesource.com/7979 Reviewed-by: Austin Clements Run-TryBot: Rick Hudson --- diff --git a/src/runtime/os1_windows.go b/src/runtime/os1_windows.go index 561d3ce457..4ae1a8411b 100644 --- a/src/runtime/os1_windows.go +++ b/src/runtime/os1_windows.go @@ -359,6 +359,8 @@ func nanotime() int64 { } // Calling stdcall on os stack. +// May run during STW, so write barriers are not allowed. +//go:nowritebarrier //go:nosplit func stdcall(fn stdFunction) uintptr { gp := getg() @@ -367,7 +369,8 @@ func stdcall(fn stdFunction) uintptr { if mp.profilehz != 0 { // leave pc/sp for cpu profiler - mp.libcallg = gp + // gp is on allg, so this WB can be eliminated. + setGNoWriteBarrier(&mp.libcallg, gp) mp.libcallpc = getcallerpc(unsafe.Pointer(&fn)) // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them