diff options
author | Ian Lance Taylor <iant@golang.org> | 2016-06-28 17:06:59 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2016-06-29 01:37:19 +0000 |
commit | c7ae41e5770b2258074eee68a6a3c4d0d71a251f (patch) | |
tree | e45eaa1de22e70f69c64e4eaad62484fdcf7fdfa | |
parent | 8641e6fe2131ac342647fa34398a727f96d15fb5 (diff) | |
download | go-c7ae41e5770b2258074eee68a6a3c4d0d71a251f.tar.gz go-c7ae41e5770b2258074eee68a6a3c4d0d71a251f.zip |
runtime: better error message for newosproc failure
If creating a new thread fails with EAGAIN, point the user at ulimit.
Fixes #15476.
Change-Id: Ib36519614b5c72776ea7f218a0c62df1dd91a8ea
Reviewed-on: https://go-review.googlesource.com/24570
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/runtime/os3_solaris.go | 3 | ||||
-rw-r--r-- | src/runtime/os_dragonfly.go | 1 | ||||
-rw-r--r-- | src/runtime/os_freebsd.go | 1 | ||||
-rw-r--r-- | src/runtime/os_linux.go | 3 | ||||
-rw-r--r-- | src/runtime/os_netbsd.go | 5 | ||||
-rw-r--r-- | src/runtime/os_openbsd.go | 3 |
6 files changed, 16 insertions, 0 deletions
diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index 349f4abbcf..9368e0d5c6 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -165,6 +165,9 @@ func newosproc(mp *m, _ unsafe.Pointer) { sigprocmask(_SIG_SETMASK, &oset, nil) if ret != 0 { print("runtime: failed to create new OS thread (have ", mcount(), " already; errno=", ret, ")\n") + if ret == -_EAGAIN { + println("runtime: may need to increase max user processes (ulimit -u)") + } throw("newosproc") } } diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index 78a150eee5..85d4aadbfe 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -134,6 +134,7 @@ func newosproc(mp *m, stk unsafe.Pointer) { tid2: nil, } + // TODO: Check for error. lwp_create(¶ms) sigprocmask(_SIG_SETMASK, &oset, nil) } diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index 3a73b66277..c187ee805f 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -121,6 +121,7 @@ func newosproc(mp *m, stk unsafe.Pointer) { var oset sigset sigprocmask(_SIG_SETMASK, &sigset_all, &oset) + // TODO: Check for error. thr_new(¶m, int32(unsafe.Sizeof(param))) sigprocmask(_SIG_SETMASK, &oset, nil) } diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 35b57d8a23..542f214a42 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -154,6 +154,9 @@ func newosproc(mp *m, stk unsafe.Pointer) { if ret < 0 { print("runtime: failed to create new OS thread (have ", mcount(), " already; errno=", -ret, ")\n") + if ret == -_EAGAIN { + println("runtime: may need to increase max user processes (ulimit -u)") + } throw("newosproc") } } diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 41f34f7132..4c44b2bb20 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -20,6 +20,8 @@ const ( // From NetBSD's <sys/ucontext.h> _UC_SIGMASK = 0x01 _UC_CPU = 0x04 + + _EAGAIN = 35 ) type mOS struct { @@ -162,6 +164,9 @@ func newosproc(mp *m, stk unsafe.Pointer) { ret := lwp_create(unsafe.Pointer(&uc), 0, unsafe.Pointer(&mp.procid)) if ret < 0 { print("runtime: failed to create new OS thread (have ", mcount()-1, " already; errno=", -ret, ")\n") + if ret == -_EAGAIN { + println("runtime: may need to increase max user processes (ulimit -p)") + } throw("runtime.newosproc") } } diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index ded6b1d4ea..9a5c53ef9e 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -154,6 +154,9 @@ func newosproc(mp *m, stk unsafe.Pointer) { if ret < 0 { print("runtime: failed to create new OS thread (have ", mcount()-1, " already; errno=", -ret, ")\n") + if ret == -_EAGAIN { + println("runtime: may need to increase max user processes (ulimit -p)") + } throw("runtime.newosproc") } } |