Use a single writeErrStr function. Avoid using global variables.
Use a single version of some error messages rather than duplicating
the messages in OS-specific files.
Change-Id: If259fbe78faf797f0a21337d14472160ca03efa0
Reviewed-on: https://go-review.googlesource.com/c/go/+/447055
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
)
if pthread_attr_init(&attr) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
if pthread_attr_setstacksize(&attr, threadStackSize) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
sigprocmask(_SIG_SETMASK, &oset, nil)
if ret != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
-var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
-
// Called to do synchronous initialization of Go code built with
// -buildmode=c-archive or -buildmode=c-shared.
// None of the Go runtime is initialized.
var err int32
err = pthread_attr_init(&attr)
if err != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
// Find out OS stack size for our own stack guard.
var stacksize uintptr
if pthread_attr_getstacksize(&attr, &stacksize) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
mp.g0.stack.hi = stacksize // for mstart
// Tell the pthread library we won't join with this thread.
if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
err = pthread_create(&attr, abi.FuncPCABI0(mstart_stub), unsafe.Pointer(mp))
sigprocmask(_SIG_SETMASK, &oset, nil)
if err != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
var err int32
err = pthread_attr_init(&attr)
if err != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
// we use the OS default stack size instead of the suggestion.
// Find out that stack size for our own stack guard.
if pthread_attr_getstacksize(&attr, &stacksize) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
g0.stack.hi = stacksize // for mstart
// Tell the pthread library we won't join with this thread.
if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
err = pthread_create(&attr, fn, nil)
sigprocmask(_SIG_SETMASK, &oset, nil)
if err != 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
-var failallocatestack = []byte("runtime: failed to allocate stack for the new OS thread\n")
-var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
-
// Called to do synchronous initialization of Go code built with
// -buildmode=c-archive or -buildmode=c-shared.
// None of the Go runtime is initialized.
func newosproc0(stacksize uintptr, fn unsafe.Pointer) {
stack := sysAlloc(stacksize, &memstats.stacks_sys)
if stack == nil {
- write(2, unsafe.Pointer(&failallocatestack[0]), int32(len(failallocatestack)))
+ writeErrStr(failallocatestack)
exit(1)
}
// This code "knows" it's being called once from the library
ret := thr_new(¶m, int32(unsafe.Sizeof(param)))
sigprocmask(_SIG_SETMASK, &oset, nil)
if ret < 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
-var failallocatestack = []byte("runtime: failed to allocate stack for the new OS thread\n")
-var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
-
// Called to do synchronous initialization of Go code built with
// -buildmode=c-archive or -buildmode=c-shared.
// None of the Go runtime is initialized.
func newosproc0(stacksize uintptr, fn unsafe.Pointer) {
stack := sysAlloc(stacksize, &memstats.stacks_sys)
if stack == nil {
- write(2, unsafe.Pointer(&failallocatestack[0]), int32(len(failallocatestack)))
+ writeErrStr(failallocatestack)
exit(1)
}
ret := clone(cloneFlags, unsafe.Pointer(uintptr(stack)+stacksize), nil, nil, fn)
if ret < 0 {
- write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
}
-var failallocatestack = []byte("runtime: failed to allocate stack for the new OS thread\n")
-var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
-
const (
_AT_NULL = 0 // End of vector
_AT_PAGESZ = 6 // System physical page size
"unsafe"
)
-var failThreadCreate = []byte("runtime: failed to create new OS thread\n")
-
// mstart_stub provides glue code to call mstart from pthread_create.
func mstart_stub()
// Initialize an attribute object.
var attr pthreadattr
if err := pthread_attr_init(&attr); err != 0 {
- write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
// Find out OS stack size for our own stack guard.
var stacksize uintptr
if pthread_attr_getstacksize(&attr, &stacksize) != 0 {
- write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
mp.g0.stack.hi = stacksize // for mstart
// Tell the pthread library we won't join with this thread.
if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 {
- write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
err := pthread_create(&attr, abi.FuncPCABI0(mstart_stub), unsafe.Pointer(mp))
sigprocmask(_SIG_SETMASK, &oset, nil)
if err != 0 {
- write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate)))
+ writeErrStr(failthreadcreate)
exit(1)
}
panic(plainError("arg size to reflect.call more than 1GB"))
}
-var badmorestackg0Msg = "fatal: morestack on g0\n"
-
//go:nosplit
//go:nowritebarrierrec
func badmorestackg0() {
- sp := stringStructOf(&badmorestackg0Msg)
- write(2, sp.str, int32(sp.len))
+ writeErrStr("fatal: morestack on g0\n")
}
-var badmorestackgsignalMsg = "fatal: morestack on gsignal\n"
-
//go:nosplit
//go:nowritebarrierrec
func badmorestackgsignal() {
- sp := stringStructOf(&badmorestackgsignalMsg)
- write(2, sp.str, int32(sp.len))
+ writeErrStr("fatal: morestack on gsignal\n")
}
//go:nosplit
// for details.
//
// Can not throw, because scheduler is not initialized yet.
- write(2, unsafe.Pointer(&earlycgocallback[0]), int32(len(earlycgocallback)))
+ writeErrStr("fatal error: cgo callback before cgo call\n")
exit(1)
}
sched.ngsys.Add(-1)
}
-var earlycgocallback = []byte("fatal error: cgo callback before cgo call\n")
-
// newextram allocates m's and puts them on the extra list.
// It is called with a working local m, so that it can do things
// like call schedlock and allocate.
execLock rwmutex
)
+// These errors are reported (via writeErrStr) by some OS-specific
+// versions of newosproc and newosproc0.
+const (
+ failthreadcreate = "runtime: failed to create new OS thread\n"
+ failallocatestack = "runtime: failed to allocate stack for the new OS thread\n"
+)
+
// newmHandoff contains a list of m structures that need new OS threads.
// This is used by newm in situations where newm itself can't safely
// start an OS thread.
import (
"runtime/internal/atomic"
- _ "unsafe" // for go:linkname
+ "unsafe"
)
//go:generate go run wincallback.go
godebugenv.Store(nil)
}
}
+
+// writeErrStr writes a string to descriptor 2.
+//
+//go:nosplit
+func writeErrStr(s string) {
+ write(2, unsafe.Pointer(unsafe.StringData(s)), int32(len(s)))
+}
throw("signal received during fork")
}
-var badginsignalMsg = "fatal: bad g in signal handler\n"
-
// This runs on a foreign stack, without an m or a g. No stack split.
//
//go:nosplit
// There is no extra M. needm will not be able to grab
// an M. Instead of hanging, just crash.
// Cannot call split-stack function as there is no G.
- s := stringStructOf(&badginsignalMsg)
- write(2, s.str, int32(s.len))
+ writeErrStr("fatal: bad g in signal handler\n")
exit(2)
*(*uintptr)(unsafe.Pointer(uintptr(123))) = 2
}
//go:noescape
func systemstack(fn func())
-var badsystemstackMsg = "fatal: systemstack called from unexpected goroutine"
-
//go:nosplit
//go:nowritebarrierrec
func badsystemstack() {
- sp := stringStructOf(&badsystemstackMsg)
- write(2, sp.str, int32(sp.len))
+ writeErrStr("fatal: systemstack called from unexpected goroutine")
}
// memclrNoHeapPointers clears n bytes starting at ptr.