Commit c6e7cb4a authored by Benny Siegert's avatar Benny Siegert Committed by Ian Lance Taylor

runtime: work around NetBSD bug in thread creation

Block signals explicitly during lwp_create since blocking via
the context does not work.

This was originally added in pkgsrc as
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/lang/go/patches/patch-src_runtime_os__netbsd.go?rev=1.1

Fixes #19295.

Change-Id: I431e70c047cff446e9cfc20d356f45df98c63487
Reviewed-on: https://go-review.googlesource.com/41350Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 708a01fb
......@@ -167,13 +167,23 @@ func newosproc(mp *m, stk unsafe.Pointer) {
var uc ucontextt
getcontext(unsafe.Pointer(&uc))
// _UC_SIGMASK does not seem to work here.
// It would be nice if _UC_SIGMASK and _UC_STACK
// worked so that we could do all the work setting
// the sigmask and the stack here, instead of setting
// the mask here and the stack in netbsdMstart.
// For now do the blocking manually.
uc.uc_flags = _UC_SIGMASK | _UC_CPU
uc.uc_link = nil
uc.uc_sigmask = sigset_all
var oset sigset
sigprocmask(_SIG_SETMASK, &sigset_all, &oset)
lwp_mcontext_init(&uc.uc_mcontext, stk, mp, mp.g0, funcPC(netbsdMstart))
ret := lwp_create(unsafe.Pointer(&uc), 0, unsafe.Pointer(&mp.procid))
sigprocmask(_SIG_SETMASK, &oset, nil)
if ret < 0 {
print("runtime: failed to create new OS thread (have ", mcount()-1, " already; errno=", -ret, ")\n")
if ret == -_EAGAIN {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment