From c6e7cb4a375966f7b034e6dbf439a58ea326104a Mon Sep 17 00:00:00 2001 From: Benny Siegert Date: Fri, 21 Apr 2017 08:48:57 +0000 Subject: [PATCH] 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/41350 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/runtime/os_netbsd.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index c79b50b70b..c26c3c9550 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -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 {