mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: make cgocallback wait on package init
With the new buildmodes c-archive and c-shared, it is possible for a cgo call to come in early in the lifecycle of a Go program. Calls before the runtime has been initialized are caught by _cgo_wait_runtime_init_done. However a call can come in after the runtime has initialized, but before the program's package init functions have finished running. To avoid this cgocallback checks m.ncgo to see if we are on a thread running Go. If not, we may be a foreign thread and it blocks until main_init is complete. Change-Id: I7a9f137fa2a40c322a0b93764261f9aa17fcf5b8 Reviewed-on: https://go-review.googlesource.com/8897 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
cea272de30
commit
3b22ffc07e
4 changed files with 45 additions and 11 deletions
|
|
@ -12,6 +12,12 @@ func runtime_init()
|
|||
//go:linkname main_init main.init
|
||||
func main_init()
|
||||
|
||||
// main_init_done is a signal used by cgocallbackg that initialization
|
||||
// has been completed. It is made before _cgo_notify_runtime_init_done,
|
||||
// so all cgo calls can rely on it existing. When main_init is complete,
|
||||
// it is closed, meaning cgocallbackg can reliably receive from it.
|
||||
var main_init_done chan bool
|
||||
|
||||
//go:linkname main_main main.main
|
||||
func main_main()
|
||||
|
||||
|
|
@ -70,6 +76,7 @@ func main() {
|
|||
// Allocate new M as main_main() is expected to block forever.
|
||||
systemstack(newextram)
|
||||
}
|
||||
main_init_done = make(chan bool)
|
||||
if iscgo {
|
||||
if _cgo_thread_start == nil {
|
||||
throw("_cgo_thread_start missing")
|
||||
|
|
@ -95,6 +102,7 @@ func main() {
|
|||
}
|
||||
|
||||
main_init()
|
||||
close(main_init_done)
|
||||
|
||||
needUnlock = false
|
||||
unlockOSThread()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue