runtime: handle runtime.Goexit during init

Fixes #5963.

R=golang-dev, dsymonds, dvyukov
CC=golang-dev
https://golang.org/cl/11879045
diff --git a/test/fixedbugs/issue5963.go b/test/fixedbugs/issue5963.go
new file mode 100644
index 0000000..190e8f4
--- /dev/null
+++ b/test/fixedbugs/issue5963.go
@@ -0,0 +1,50 @@
+// run
+
+// Copyright 2013 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to die in runtime due to init goroutine exiting while
+// locked to main thread.
+
+package main
+
+import (
+	"os"
+	"runtime"
+)
+
+func init() {
+	c := make(chan int, 1)
+	defer func() {
+		c <- 0
+	}()
+	go func() {
+		os.Exit(<-c)
+	}()
+	runtime.Goexit()
+}
+
+func main() {
+}
+
+/* Before fix:
+
+invalid m->locked = 2
+fatal error: internal lockOSThread error
+
+goroutine 2 [runnable]:
+runtime.MHeap_Scavenger()
+	/Users/rsc/g/go/src/pkg/runtime/mheap.c:438
+runtime.goexit()
+	/Users/rsc/g/go/src/pkg/runtime/proc.c:1313
+created by runtime.main
+	/Users/rsc/g/go/src/pkg/runtime/proc.c:165
+
+goroutine 3 [runnable]:
+main.funcĀ·002()
+	/Users/rsc/g/go/test/fixedbugs/issue5963.go:22
+created by main.initĀ·1
+	/Users/rsc/g/go/test/fixedbugs/issue5963.go:24 +0xb9
+exit status 2
+*/