]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: do not calculate asmstdcall address every time we make syscall
authorAlex Brainman <alex.brainman@gmail.com>
Thu, 9 Apr 2015 01:32:47 +0000 (11:32 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 9 Apr 2015 04:26:44 +0000 (04:26 +0000)
Change-Id: If3c8c9035e12d41647ae4982883f6a979313ea9d
Reviewed-on: https://go-review.googlesource.com/8682
Reviewed-by: Minux Ma <minux@golang.org>
src/runtime/os1_windows.go
src/runtime/os2_windows.go
src/runtime/syscall_windows.go

index 9a077af88e5cf6642848412f376cd30641b3f731..508c4951e8468f718dfce29510e67c6d7d587b32 100644 (file)
@@ -94,6 +94,12 @@ var (
        _GetQueuedCompletionStatusEx stdFunction
 )
 
+// Call a Windows function with stdcall conventions,
+// and switch to os stack during the call.
+func asmstdcall(fn unsafe.Pointer)
+
+var asmstdcallAddr unsafe.Pointer
+
 func loadOptionalSyscalls() {
        var buf [50]byte // large enough for longest string
        strtoptr := func(s string) uintptr {
@@ -157,6 +163,8 @@ func getVersion() (major, minor byte) {
 }
 
 func osinit() {
+       asmstdcallAddr = unsafe.Pointer(funcPC(asmstdcall))
+
        setBadSignalMsg()
 
        loadOptionalSyscalls()
@@ -391,7 +399,7 @@ func stdcall(fn stdFunction) uintptr {
                // all three values to be non-zero, it will use them
                mp.libcallsp = getcallersp(unsafe.Pointer(&fn))
        }
-       asmcgocall(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&mp.libcall))
+       asmcgocall(asmstdcallAddr, unsafe.Pointer(&mp.libcall))
        mp.libcallsp = 0
        return mp.libcall.r1
 }
index d5b1f471fc1575f6596b3b013687d1e87e5c5f26..a867dfeb6407b0153fb45cfc83995b3cff93f75a 100644 (file)
@@ -4,12 +4,6 @@
 
 package runtime
 
-import "unsafe"
-
-// Call a Windows function with stdcall conventions,
-// and switch to os stack during the call.
-func asmstdcall(fn unsafe.Pointer)
-
 func getlasterror() uint32
 func setlasterror(err uint32)
 
index cd8b8847bde1426bdcb7f780b41d0add939f713e..370b1724d5f4eec71c8fc1930bbf71e950cc6a40 100644 (file)
@@ -95,7 +95,7 @@ func syscall_loadlibrary(filename *uint16) (handle, err uintptr) {
        c.fn = getLoadLibrary()
        c.n = 1
        c.args = uintptr(unsafe.Pointer(&filename))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        handle = c.r1
        if handle == 0 {
                err = c.err
@@ -110,7 +110,7 @@ func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uint
        c.fn = getGetProcAddress()
        c.n = 2
        c.args = uintptr(unsafe.Pointer(&handle))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        outhandle = c.r1
        if outhandle == 0 {
                err = c.err
@@ -125,7 +125,7 @@ func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
        c.fn = fn
        c.n = nargs
        c.args = uintptr(unsafe.Pointer(&a1))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        return c.r1, c.r2, c.err
 }
 
@@ -136,7 +136,7 @@ func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err ui
        c.fn = fn
        c.n = nargs
        c.args = uintptr(unsafe.Pointer(&a1))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        return c.r1, c.r2, c.err
 }
 
@@ -147,7 +147,7 @@ func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1
        c.fn = fn
        c.n = nargs
        c.args = uintptr(unsafe.Pointer(&a1))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        return c.r1, c.r2, c.err
 }
 
@@ -158,7 +158,7 @@ func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
        c.fn = fn
        c.n = nargs
        c.args = uintptr(unsafe.Pointer(&a1))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        return c.r1, c.r2, c.err
 }
 
@@ -169,6 +169,6 @@ func syscall_Syscall15(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
        c.fn = fn
        c.n = nargs
        c.args = uintptr(unsafe.Pointer(&a1))
-       cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
+       cgocall_errno(asmstdcallAddr, unsafe.Pointer(&c))
        return c.r1, c.r2, c.err
 }