diff options
Diffstat (limited to 'src/pkg/runtime')
| -rw-r--r-- | src/pkg/runtime/crash_test.go | 14 | ||||
| -rw-r--r-- | src/pkg/runtime/extern.go | 5 | ||||
| -rw-r--r-- | src/pkg/runtime/proc.c | 2 |
3 files changed, 13 insertions, 8 deletions
diff --git a/src/pkg/runtime/crash_test.go b/src/pkg/runtime/crash_test.go index cd9520b165..dbcd9486de 100644 --- a/src/pkg/runtime/crash_test.go +++ b/src/pkg/runtime/crash_test.go @@ -111,8 +111,9 @@ func TestLockedDeadlock2(t *testing.T) { func TestGoexitDeadlock(t *testing.T) { output := executeTest(t, goexitDeadlockSource, nil) - if output != "" { - t.Fatalf("expected no output, got:\n%s", output) + want := "no goroutines (main called runtime.Goexit) - deadlock!" + if !strings.Contains(output, want) { + t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want) } } @@ -144,13 +145,12 @@ panic: again } -func TestGoexitExit(t *testing.T) { +func TestGoexitCrash(t *testing.T) { output := executeTest(t, goexitExitSource, nil) - want := "" - if output != want { - t.Fatalf("output:\n%s\n\nwanted:\n%s", output, want) + want := "no goroutines (main called runtime.Goexit) - deadlock!" + if !strings.Contains(output, want) { + t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want) } - } const crashSource = ` diff --git a/src/pkg/runtime/extern.go b/src/pkg/runtime/extern.go index 0c5041d38b..2466911dd6 100644 --- a/src/pkg/runtime/extern.go +++ b/src/pkg/runtime/extern.go @@ -79,6 +79,11 @@ func Gosched() // Goexit terminates the goroutine that calls it. No other goroutine is affected. // Goexit runs all deferred calls before terminating the goroutine. +// +// Calling Goexit from the main goroutine terminates that goroutine +// without func main returning. Since func main has not returned, +// the program continues execution of other goroutines. +// If all other goroutines exit, the program crashes. func Goexit() // Caller reports file and line number information about function invocations on diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 6b5c031c87..52b02d94bb 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -2501,7 +2501,7 @@ checkdead(void) } runtime·unlock(&allglock); if(grunning == 0) // possible if main goroutine calls runtime·Goexit() - runtime·exit(0); + runtime·throw("no goroutines (main called runtime.Goexit) - deadlock!"); m->throwing = -1; // do not dump full stacks runtime·throw("all goroutines are asleep - deadlock!"); } |
