]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: minimize time between lockextra/unlockextra
authorIan Lance Taylor <iant@golang.org>
Tue, 12 Jan 2016 23:34:03 +0000 (15:34 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 14 Jan 2016 05:55:43 +0000 (05:55 +0000)
This doesn't fix a bug, but may improve performance in programs that
have many concurrent calls from C to Go.  The old code made several
system calls between lockextra and unlockextra.  That could be happening
while another thread is spinning acquiring lockextra.  This changes the
code to not make any system calls while holding the lock.

Change-Id: I50576478e478670c3d6429ad4e1b7d80f98a19d8
Reviewed-on: https://go-review.googlesource.com/18548
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/os1_darwin.go
src/runtime/os1_dragonfly.go
src/runtime/os1_freebsd.go
src/runtime/os1_linux.go
src/runtime/os1_nacl.go
src/runtime/os1_netbsd.go
src/runtime/os1_openbsd.go
src/runtime/os1_plan9.go
src/runtime/os1_windows.go
src/runtime/os3_solaris.go
src/runtime/proc.go

index b5a1f5911950fd326607e3917322d97c828b436d..e9e0b6aa1cebb67e3015807161a7a4233a4f72fa 100644 (file)
@@ -147,8 +147,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, &sigmask, nil)
 }
 
 //go:nosplit
index 59ffb809d3f40d5534917b61fd91090f1f54f17f..5b146209dc948a8e65afcff25461c37f3732e10e 100644 (file)
@@ -123,8 +123,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, &sigmask, nil)
 }
 
 //go:nosplit
index 05d13439b8a648f65ef65bbb78008070a30c77ab..79d995476e88cbd27121ade041108db45276fbd0 100644 (file)
@@ -126,8 +126,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, &sigmask, nil)
 }
 
 //go:nosplit
index 747a1ac5e373e31e5e078df1d388f279f3b1f644..b38cfc14f91a2a88f99d295e398f0dd0fa9781fd 100644 (file)
@@ -213,9 +213,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       smask := &mp.sigmask
-       rtsigprocmask(_SIG_SETMASK, smask, nil, int32(unsafe.Sizeof(*smask)))
+func msigrestore(sigmask sigset) {
+       rtsigprocmask(_SIG_SETMASK, &sigmask, nil, int32(unsafe.Sizeof(sigmask)))
 }
 
 //go:nosplit
index 3af51b7017156d815bc1390c019cd08c071ce6fa..dab205de6a3d3a49c0d754ccc9325a8602c90772 100644 (file)
@@ -22,7 +22,7 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
+func msigrestore(sigmask sigset) {
 }
 
 //go:nosplit
index 79524aaf272f24615a89e157733c96e440fb4987..42199020e51546150d499e5a387b1db6d52a6a72 100644 (file)
@@ -144,8 +144,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, &sigmask, nil)
 }
 
 //go:nosplit
index 7e1aa33f0b63cc262677bdc012d1f16c5db7b8d4..a6cefa20392ef12806d6a8fc307e5c9e618cf8c7 100644 (file)
@@ -156,8 +156,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, mp.sigmask)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, sigmask)
 }
 
 //go:nosplit
index 61ebc1dc205784000d6017da6f50e32d902166ea..7506d591df4b8c471026764d96b0281ea9f72502 100644 (file)
@@ -26,7 +26,7 @@ func mpreinit(mp *m) {
 func msigsave(mp *m) {
 }
 
-func msigrestore(mp *m) {
+func msigrestore(sigmask sigset) {
 }
 
 func sigblock() {
index a59e9ec88cb5fa2c71baf0c1d6fa361fabb8abb1..a28e11e088db114102655ce0562acb5a8ac3d284 100644 (file)
@@ -391,7 +391,7 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
+func msigrestore(sigmask sigset) {
 }
 
 //go:nosplit
index 7d9ee5c00e9e9474468eeb5961a9a2bd82a8defb..3f2efa88c78511eb6775ad112c57e0d78c6211b8 100644 (file)
@@ -198,8 +198,8 @@ func msigsave(mp *m) {
 }
 
 //go:nosplit
-func msigrestore(mp *m) {
-       sigprocmask(_SIG_SETMASK, &mp.sigmask, nil)
+func msigrestore(sigmask sigset) {
+       sigprocmask(_SIG_SETMASK, &sigmask, nil)
 }
 
 //go:nosplit
@@ -540,6 +540,7 @@ func sigaltstack(ss *sigaltstackt, oss *sigaltstackt) /* int32 */ {
 
 //go:nosplit
 //go:nowritebarrierrec
+//go:noescape
 func sigprocmask(how int32, set *sigset, oset *sigset) /* int32 */ {
        sysvicall3(&libc_sigprocmask, uintptr(how), uintptr(unsafe.Pointer(set)), uintptr(unsafe.Pointer(oset)))
 }
index be1bb815d5f7bc4ec968f322723e134c376f564c..a7e94a9c1d421f403b776ecce04547c489034c61 100644 (file)
@@ -1427,20 +1427,24 @@ func dropm() {
        // After the call to setg we can only call nosplit functions
        // with no pointer manipulation.
        mp := getg().m
-       mnext := lockextra(true)
-       mp.schedlink.set(mnext)
 
        // Block signals before unminit.
        // Unminit unregisters the signal handling stack (but needs g on some systems).
        // Setg(nil) clears g, which is the signal handler's cue not to run Go handlers.
        // It's important not to try to handle a signal between those two steps.
+       sigmask := mp.sigmask
        sigblock()
        unminit()
+
+       mnext := lockextra(true)
+       mp.schedlink.set(mnext)
+
        setg(nil)
-       msigrestore(mp)
 
        // Commit the release of mp.
        unlockextra(mp)
+
+       msigrestore(sigmask)
 }
 
 // A helper function for EnsureDropM.