diff options
author | Ian Lance Taylor <iant@golang.org> | 2017-09-13 15:53:47 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2017-09-22 18:17:13 +0000 |
commit | 332719f7cee2abafb3963009d44ad7cc93474707 (patch) | |
tree | 39371a6dbd9e627f28b1ee585a2b6c629ed3e3a7 /src/runtime/syscall_windows.go | |
parent | 9daee931214a7ad68579f4bb2695bba561067c58 (diff) | |
download | go-332719f7cee2abafb3963009d44ad7cc93474707.tar.gz go-332719f7cee2abafb3963009d44ad7cc93474707.zip |
runtime: don't call lockOSThread for every cgo call
For a trivial benchmark with a do-nothing cgo call:
name old time/op new time/op delta
Call-4 64.5ns ± 7% 63.0ns ± 6% -2.25% (p=0.027 n=20+16)
Because Windows uses the cgocall mechanism to make system calls,
and passes arguments in a struct held in the m,
we need to do the lockOSThread/unlockOSThread in that code.
Because deferreturn was getting a nosplit stack overflow error,
change it to avoid calling typedmemmove.
Updates #21827.
Change-Id: I9b1d61434c44faeb29805b46b409c812c9acadc2
Reviewed-on: https://go-review.googlesource.com/64070
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/runtime/syscall_windows.go')
-rw-r--r-- | src/runtime/syscall_windows.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go index ca8ea8b04f..f170bc3f8f 100644 --- a/src/runtime/syscall_windows.go +++ b/src/runtime/syscall_windows.go @@ -93,6 +93,8 @@ const _LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 //go:linkname syscall_loadsystemlibrary syscall.loadsystemlibrary //go:nosplit func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall if useLoadLibraryEx { @@ -126,6 +128,8 @@ func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) { //go:linkname syscall_loadlibrary syscall.loadlibrary //go:nosplit func syscall_loadlibrary(filename *uint16) (handle, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = getLoadLibrary() c.n = 1 @@ -141,6 +145,8 @@ func syscall_loadlibrary(filename *uint16) (handle, err uintptr) { //go:linkname syscall_getprocaddress syscall.getprocaddress //go:nosplit func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = getGetProcAddress() c.n = 2 @@ -156,6 +162,8 @@ func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uint //go:linkname syscall_Syscall syscall.Syscall //go:nosplit func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = fn c.n = nargs @@ -167,6 +175,8 @@ func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) { //go:linkname syscall_Syscall6 syscall.Syscall6 //go:nosplit func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = fn c.n = nargs @@ -178,6 +188,8 @@ func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err ui //go:linkname syscall_Syscall9 syscall.Syscall9 //go:nosplit func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = fn c.n = nargs @@ -189,6 +201,8 @@ func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1 //go:linkname syscall_Syscall12 syscall.Syscall12 //go:nosplit func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = fn c.n = nargs @@ -200,6 +214,8 @@ func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, //go:linkname syscall_Syscall15 syscall.Syscall15 //go:nosplit func syscall_Syscall15(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { + lockOSThread() + defer unlockOSThread() c := &getg().m.syscall c.fn = fn c.n = nargs |