]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: work around NetBSD bug in thread creation
authorBenny Siegert <bsiegert@gmail.com>
Fri, 21 Apr 2017 08:48:57 +0000 (08:48 +0000)
committerIan Lance Taylor <iant@golang.org>
Wed, 31 May 2017 00:50:43 +0000 (00:50 +0000)
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 <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/os_netbsd.go

index c79b50b70bf9ec650bac77f5c8d8b164b0d72a7b..c26c3c955079603a192a67bf5f65a4d5745266a9 100644 (file)
@@ -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 {