diff options
| author | Russ Cox <rsc@golang.org> | 2014-04-16 13:12:18 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2014-04-16 13:12:18 -0400 |
| commit | ade6bc68b0d71477b3370a20099bcb66de14f517 (patch) | |
| tree | 1d9d2a59acce73269fdc0f9e7fd33bb015ed21b8 /src/pkg/runtime/proc.c | |
| parent | 468cf827803ddffd0d72167c44f750dde004aae4 (diff) | |
| download | go-ade6bc68b0d71477b3370a20099bcb66de14f517.tar.xz | |
runtime: crash when func main calls Goexit and all other goroutines exit
This has typically crashed in the past, although usually with
an 'all goroutines are asleep - deadlock!' message that shows
no goroutines (because there aren't any).
Previous discussion at:
https://groups.google.com/d/msg/golang-nuts/uCT_7WxxopQ/BoSBlLFzUTkJ
https://groups.google.com/d/msg/golang-dev/KUojayEr20I/u4fp_Ej5PdUJ
http://golang.org/issue/7711
There is general agreement that runtime.Goexit terminates the
main goroutine, so that main cannot return, so the program does
not exit.
The interpretation that all other goroutines exiting causes an
exit(0) is relatively new and was not part of those discussions.
That is what this CL changes.
Thankfully, even though the exit(0) has been there for a while,
some other accounting bugs made it very difficult to trigger,
so it is reasonable to replace. In particular, see golang.org/issue/7711#c10
for an examination of the behavior across past releases.
Fixes #7711.
LGTM=iant, r
R=golang-codereviews, iant, dvyukov, r
CC=golang-codereviews
https://golang.org/cl/88210044
Diffstat (limited to 'src/pkg/runtime/proc.c')
| -rw-r--r-- | src/pkg/runtime/proc.c | 2 |
1 files changed, 1 insertions, 1 deletions
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!"); } |
