mirror of
https://github.com/golang/go
synced 2024-11-26 15:56:57 -07:00
cmd/go: fix "go run" cgo source when cgo is disabled
also move a cgo-depend test to appropriate source file in runtime. R=golang-dev, dave, adg, rsc CC=golang-dev https://golang.org/cl/7393063
This commit is contained in:
parent
67d0445c87
commit
6ecb39fce6
@ -68,8 +68,16 @@ func runRun(cmd *Command, args []string) {
|
||||
var src string
|
||||
if len(p.GoFiles) > 0 {
|
||||
src = p.GoFiles[0]
|
||||
} else {
|
||||
} else if len(p.CgoFiles) > 0 {
|
||||
src = p.CgoFiles[0]
|
||||
} else {
|
||||
// this case could only happen if the provided source uses cgo
|
||||
// while cgo is disabled.
|
||||
hint := ""
|
||||
if !buildContext.CgoEnabled {
|
||||
hint = " (cgo is disabled)"
|
||||
}
|
||||
fatalf("go run: no suitable source files%s", hint)
|
||||
}
|
||||
p.exeName = src[:len(src)-len(".go")] // name temporary executable for first go file
|
||||
a1 := b.action(modeBuild, modeBuild, p)
|
||||
|
@ -13,3 +13,76 @@ import (
|
||||
func TestCgoCrashHandler(t *testing.T) {
|
||||
testCrashHandler(t, true)
|
||||
}
|
||||
|
||||
func TestCgoSignalDeadlock(t *testing.T) {
|
||||
got := executeTest(t, cgoSignalDeadlockSource, nil)
|
||||
want := "OK\n"
|
||||
if got != want {
|
||||
t.Fatalf("expected %q, but got %q", want, got)
|
||||
}
|
||||
}
|
||||
|
||||
const cgoSignalDeadlockSource = `
|
||||
package main
|
||||
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
runtime.GOMAXPROCS(100)
|
||||
ping := make(chan bool)
|
||||
go func() {
|
||||
for i := 0; ; i++ {
|
||||
runtime.Gosched()
|
||||
select {
|
||||
case done := <-ping:
|
||||
if done {
|
||||
ping <- true
|
||||
return
|
||||
}
|
||||
ping <- true
|
||||
default:
|
||||
}
|
||||
func() {
|
||||
defer func() {
|
||||
recover()
|
||||
}()
|
||||
var s *string
|
||||
*s = ""
|
||||
}()
|
||||
}
|
||||
}()
|
||||
time.Sleep(time.Millisecond)
|
||||
for i := 0; i < 64; i++ {
|
||||
go func() {
|
||||
runtime.LockOSThread()
|
||||
select {}
|
||||
}()
|
||||
go func() {
|
||||
runtime.LockOSThread()
|
||||
select {}
|
||||
}()
|
||||
time.Sleep(time.Millisecond)
|
||||
ping <- false
|
||||
select {
|
||||
case <-ping:
|
||||
case <-time.After(time.Second):
|
||||
fmt.Printf("HANG\n")
|
||||
return
|
||||
}
|
||||
}
|
||||
ping <- true
|
||||
select {
|
||||
case <-ping:
|
||||
case <-time.After(time.Second):
|
||||
fmt.Printf("HANG\n")
|
||||
return
|
||||
}
|
||||
fmt.Printf("OK\n")
|
||||
}
|
||||
`
|
||||
|
@ -99,14 +99,6 @@ func TestLockedDeadlock2(t *testing.T) {
|
||||
testDeadlock(t, lockedDeadlockSource2)
|
||||
}
|
||||
|
||||
func TestCgoSignalDeadlock(t *testing.T) {
|
||||
got := executeTest(t, cgoSignalDeadlockSource, nil)
|
||||
want := "OK\n"
|
||||
if got != want {
|
||||
t.Fatalf("expected %q, but got %q", want, got)
|
||||
}
|
||||
}
|
||||
|
||||
const crashSource = `
|
||||
package main
|
||||
|
||||
@ -191,68 +183,3 @@ func main() {
|
||||
select {}
|
||||
}
|
||||
`
|
||||
|
||||
const cgoSignalDeadlockSource = `
|
||||
package main
|
||||
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
runtime.GOMAXPROCS(100)
|
||||
ping := make(chan bool)
|
||||
go func() {
|
||||
for i := 0; ; i++ {
|
||||
runtime.Gosched()
|
||||
select {
|
||||
case done := <-ping:
|
||||
if done {
|
||||
ping <- true
|
||||
return
|
||||
}
|
||||
ping <- true
|
||||
default:
|
||||
}
|
||||
func() {
|
||||
defer func() {
|
||||
recover()
|
||||
}()
|
||||
var s *string
|
||||
*s = ""
|
||||
}()
|
||||
}
|
||||
}()
|
||||
time.Sleep(time.Millisecond)
|
||||
for i := 0; i < 64; i++ {
|
||||
go func() {
|
||||
runtime.LockOSThread()
|
||||
select {}
|
||||
}()
|
||||
go func() {
|
||||
runtime.LockOSThread()
|
||||
select {}
|
||||
}()
|
||||
time.Sleep(time.Millisecond)
|
||||
ping <- false
|
||||
select {
|
||||
case <-ping:
|
||||
case <-time.After(time.Second):
|
||||
fmt.Printf("HANG\n")
|
||||
return
|
||||
}
|
||||
}
|
||||
ping <- true
|
||||
select {
|
||||
case <-ping:
|
||||
case <-time.After(time.Second):
|
||||
fmt.Printf("HANG\n")
|
||||
return
|
||||
}
|
||||
fmt.Printf("OK\n")
|
||||
}
|
||||
`
|
||||
|
Loading…
Reference in New Issue
Block a user