1
0
mirror of https://github.com/golang/go synced 2024-11-19 03:34:41 -07:00

runtime, runtime/cgo: make needextram a bool

Also invert it, which means it no longer needs to cross the cgo
package boundary.

Change-Id: I393cd073bda02b591a55d6bc6b8bb94970ea71cd
Reviewed-on: https://go-review.googlesource.com/8082
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
David Crawshaw 2015-03-25 07:10:45 -04:00
parent c5c6c3ab57
commit e9d9d0befc
4 changed files with 10 additions and 8 deletions

View File

@ -21,3 +21,10 @@ var (
_cgo_free unsafe.Pointer
_cgo_thread_start unsafe.Pointer
)
// iscgo is set to true by the runtime/cgo package
var iscgo bool
// cgoHasExtraM is set on startup when an extra M is created for cgo.
// The extra M must be created before any C/C++ code calls cgocallback.
var cgoHasExtraM bool

View File

@ -15,6 +15,3 @@ import _ "unsafe" // for go:linkname
//go:linkname _iscgo runtime.iscgo
var _iscgo bool = true
//go:linkname _needextram runtime.needextram
var _needextram uint32 = 1 // create an extra M on first cgo call

View File

@ -718,8 +718,8 @@ func mstart1() {
// prepare the thread to be able to handle the signals.
if _g_.m == &m0 {
// Create an extra M for callbacks on threads not created by Go.
if needextram == 1 {
needextram = 0
if iscgo && !cgoHasExtraM {
cgoHasExtraM = true
newextram()
}
initsig()
@ -817,7 +817,7 @@ func allocm(_p_ *p) *m {
// put the m back on the list.
//go:nosplit
func needm(x byte) {
if needextram != 0 {
if iscgo && !cgoHasExtraM {
// Can happen if C/C++ code calls Go from a global ctor.
// Can not throw, because scheduler is not initialized yet.
write(2, unsafe.Pointer(&earlycgocallback[0]), int32(len(earlycgocallback)))

View File

@ -605,11 +605,9 @@ var (
allm *m
allp [_MaxGomaxprocs + 1]*p
gomaxprocs int32
needextram uint32
panicking uint32
goos *int8
ncpu int32
iscgo bool
signote note
forcegc forcegcstate
sched schedt