]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: mark activeModules nosplit/nowritebarrier
authorIan Lance Taylor <iant@golang.org>
Fri, 4 Aug 2017 17:36:40 +0000 (10:36 -0700)
committerIan Lance Taylor <iant@golang.org>
Sat, 5 Aug 2017 18:05:41 +0000 (18:05 +0000)
The activeModules function is called by the cgo pointer checking code,
which is called by the write barrier (when GODEBUG=cgocheck=2), and as
such must be nosplit/nowritebarrier.

Fixes #21306

Change-Id: I57f2124f14de7f3872b2de9532abab15df95d45a
Reviewed-on: https://go-review.googlesource.com/53352
Reviewed-by: Austin Clements <austin@google.com>
misc/cgo/errors/ptr.go
src/runtime/symtab.go

index 4dafbdf3c011766b99a53e1e118dfce2e3f76cab..3e117666bffb5ba35d833325401b1e8e81a6ade5 100644 (file)
@@ -343,6 +343,14 @@ var ptrTests = []ptrTest{
                body:    `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
                fail:    false,
        },
+       {
+               // Issue #21306.
+               name:    "preempt-during-call",
+               c:       `void f() {}`,
+               imports: []string{"runtime", "sync"},
+               body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
+               fail:    false,
+       },
 }
 
 func main() {
index 8e410c456099e4facf12564242045c92821e6ba9..e1b41ca4ff8f029d132a5ce6c02ca8c4e2301549 100644 (file)
@@ -409,6 +409,11 @@ var modulesSlice unsafe.Pointer // see activeModules
 //
 // A module is active once its gcdatamask and gcbssmask have been
 // assembled and it is usable by the GC.
+//
+// This is nosplit/nowritebarrier because it is called by the
+// cgo pointer checking code.
+//go:nosplit
+//go:nowritebarrier
 func activeModules() []*moduledata {
        p := (*[]*moduledata)(atomic.Loadp(unsafe.Pointer(&modulesSlice)))
        if p == nil {