runtime: mark dropm and callees nowritebarrierrec

The CgocallbackDone function calls dropm after it calls entersyscall,
    which means that dropm must not have any write barriers. Mark it
    accordingly.
    
    Reviewed-on: https://go-review.googlesource.com/46464

From-SVN: r249577
This commit is contained in:
Ian Lance Taylor 2017-06-22 22:11:01 +00:00
parent f384e12acc
commit b34391e08e
4 changed files with 8 additions and 1 deletions

View File

@ -1,4 +1,4 @@
55b2b2dee55bd495a770347daaf858634057ecb0
c5aa42107d116c9121de447d214297c88dd9f5fa
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -32,6 +32,7 @@ func minit() {
// Called from dropm to undo the effect of an minit.
//go:nosplit
//go:nowritebarrierrec
func unminit() {
unminitSignals()
}

View File

@ -1447,6 +1447,9 @@ func oneNewExtraM() {
// in which dropm happens on each cgo call, is still correct too.
// We may have to keep the current version on systems with cgo
// but without pthreads, like Windows.
//
// CgocallBackDone calls this after releasing p, so no write barriers.
//go:nowritebarrierrec
func dropm() {
// Clear m and g, and return m to the extra list.
// After the call to setg we can only call nosplit functions
@ -1492,6 +1495,7 @@ var extraMWaiters uint32
// return a nil list head if that's what it finds. If nilokay is false,
// lockextra will keep waiting until the list head is no longer nil.
//go:nosplit
//go:nowritebarrierrec
func lockextra(nilokay bool) *m {
const locked = 1
@ -1524,6 +1528,7 @@ func lockextra(nilokay bool) *m {
}
//go:nosplit
//go:nowritebarrierrec
func unlockextra(mp *m) {
atomic.Storeuintptr(&extram, uintptr(unsafe.Pointer(mp)))
}

View File

@ -599,6 +599,7 @@ func minitSignalMask() {
// unminitSignals is called from dropm, via unminit, to undo the
// effect of calling minit on a non-Go thread.
//go:nosplit
//go:nowritebarrierrec
func unminitSignals() {
if getg().m.newSigstack {
signalstack(nil, 0)