]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: Remove write barrier on g
authorRick Hudson <rlh@golang.org>
Tue, 24 Mar 2015 15:18:46 +0000 (11:18 -0400)
committerRick Hudson <rlh@golang.org>
Tue, 24 Mar 2015 16:42:39 +0000 (16:42 +0000)
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 <austin@google.com>
Run-TryBot: Rick Hudson <rlh@golang.org>

src/runtime/os1_windows.go

index 561d3ce4575a1585431290b449047d68e98c6389..4ae1a8411b6512ef7402ae9dc63bbfe2ab86c7c0 100644 (file)
@@ -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