mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: convert syscall_windows.c to Go
This is necessary because syscall.Syscall blocks, and the garbage collector needs to be able to scan that frame while it is blocked, and C frames have no garbage collection information. Windows builders are broken now due to this problem: http://build.golang.org/log/152ca9a4be6783d3a8bf6e2f5b9fc265089728b6 LGTM=alex.brainman R=alex.brainman CC=golang-codereviews https://golang.org/cl/144830043
This commit is contained in:
parent
8e77a7ef6b
commit
2eccf0d18f
7 changed files with 138 additions and 191 deletions
|
|
@ -86,3 +86,85 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) {
|
|||
|
||||
return callbackasmAddr(n)
|
||||
}
|
||||
|
||||
func getLoadLibrary() uintptr
|
||||
|
||||
//go:nosplit
|
||||
func syscall_loadlibrary(filename *uint16) (handle, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = getLoadLibrary()
|
||||
c.n = 1
|
||||
c.args = uintptr(unsafe.Pointer(&filename))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
handle = c.r1
|
||||
if handle == 0 {
|
||||
err = c.err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getGetProcAddress() uintptr
|
||||
|
||||
//go:nosplit
|
||||
func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = getGetProcAddress()
|
||||
c.n = 2
|
||||
c.args = uintptr(unsafe.Pointer(&handle))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
outhandle = c.r1
|
||||
if outhandle == 0 {
|
||||
err = c.err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = fn
|
||||
c.n = nargs
|
||||
c.args = uintptr(unsafe.Pointer(&a1))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
return c.r1, c.r2, c.err
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = fn
|
||||
c.n = nargs
|
||||
c.args = uintptr(unsafe.Pointer(&a1))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
return c.r1, c.r2, c.err
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = fn
|
||||
c.n = nargs
|
||||
c.args = uintptr(unsafe.Pointer(&a1))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
return c.r1, c.r2, c.err
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2, err uintptr) {
|
||||
var c libcall
|
||||
c.fn = fn
|
||||
c.n = nargs
|
||||
c.args = uintptr(unsafe.Pointer(&a1))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
return c.r1, c.r2, c.err
|
||||
}
|
||||
|
||||
//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) {
|
||||
var c libcall
|
||||
c.fn = fn
|
||||
c.n = nargs
|
||||
c.args = uintptr(unsafe.Pointer(&a1))
|
||||
cgocall_errno(unsafe.Pointer(funcPC(asmstdcall)), unsafe.Pointer(&c))
|
||||
return c.r1, c.r2, c.err
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue