|
| @@ -83,47 +83,48 @@ func load() error { |
| 83 | | } | 83 | | } |
| 84 | | } | 84 | | } |
| 85 | | | 85 | | |
| 86 | - | cbDispatcher = purego.NewCallback(dispatch) | 86 | + | cbDispatcher = purego.NewCallbackInts(func(a *purego.CallbackArgs) uintptr { |
| 87 | - | cbDestroy = purego.NewCallback(destroyed) | 87 | + | // C memory owned by libwayland; reinterpret pointer bits without uintptr-to-pointer conversion. |
| 88 | - | cbBind = purego.NewCallback(bind) | 88 | + | msg, args := a.Int(3), a.Int(4) |
| 89 | - | cbWake = purego.NewCallback(wake) | 89 | + | return uintptr(uint32(dispatch(a.Int(0), a.Int(1), uint32(a.Int(2)), *(*unsafe.Pointer)(unsafe.Pointer(&msg)), *(*unsafe.Pointer)(unsafe.Pointer(&args))))) |
| | | 90 | + | }) |
| | | 91 | + | cbDestroy = purego.NewCallbackInts(func(a *purego.CallbackArgs) uintptr { |
| | | 92 | + | destroyed(a.Int(0)) |
| | | 93 | + | return 0 |
| | | 94 | + | }) |
| | | 95 | + | cbBind = purego.NewCallbackInts(func(a *purego.CallbackArgs) uintptr { |
| | | 96 | + | bind(a.Int(0), a.Int(1), uint32(a.Int(2)), uint32(a.Int(3))) |
| | | 97 | + | return 0 |
| | | 98 | + | }) |
| | | 99 | + | cbWake = purego.NewCallbackInts(func(a *purego.CallbackArgs) uintptr { |
| | | 100 | + | return uintptr(uint32(wake(int32(a.Int(0)), uint32(a.Int(1)), a.Int(2)))) |
| | | 101 | + | }) |
| 90 | | }) | 102 | | }) |
| 91 | | return loadErr | 103 | | return loadErr |
| 92 | | } | 104 | | } |
| 93 | | | 105 | | |
| 94 | - | // callArgs is scratch for SyscallN so hot calls do not allocate a variadic | | | |
| 95 | - | // slice. Display goroutine only; all libwayland calls run there. | | | |
| 96 | - | var callArgs [6]uintptr | | | |
| 97 | - | | | | |
| 98 | | // Integer and pointer-only entry points avoid RegisterLibFunc's reflective call path. | 106 | | // Integer and pointer-only entry points avoid RegisterLibFunc's reflective call path. |
| 99 | | func wlDisplayFlushClients(display uintptr) { | 107 | | func wlDisplayFlushClients(display uintptr) { |
| 100 | - | callArgs[0] = display | 108 | + | purego.Syscall6(symDisplayFlushClients, display, 0, 0, 0, 0, 0) |
| 101 | - | purego.SyscallN(symDisplayFlushClients, callArgs[:1]...) | | | |
| 102 | | } | 109 | | } |
| 103 | | func wlEventLoopDispatch(loop uintptr, timeout int32) int32 { | 110 | | func wlEventLoopDispatch(loop uintptr, timeout int32) int32 { |
| 104 | - | callArgs[0], callArgs[1] = loop, uintptr(timeout) | 111 | + | r, _, _ := purego.Syscall6(symEventLoopDispatch, loop, uintptr(timeout), 0, 0, 0, 0) |
| 105 | - | r, _, _ := purego.SyscallN(symEventLoopDispatch, callArgs[:2]...) | | | |
| 106 | | return int32(r) | 112 | | return int32(r) |
| 107 | | } | 113 | | } |
| 108 | | func wlResourceCreate(client, iface uintptr, version int32, id uint32) uintptr { | 114 | | func wlResourceCreate(client, iface uintptr, version int32, id uint32) uintptr { |
| 109 | - | callArgs[0], callArgs[1], callArgs[2], callArgs[3] = client, iface, uintptr(version), uintptr(id) | 115 | + | r, _, _ := purego.Syscall6(symResourceCreate, client, iface, uintptr(version), uintptr(id), 0, 0) |
| 110 | - | r, _, _ := purego.SyscallN(symResourceCreate, callArgs[:4]...) | | | |
| 111 | | return r | 116 | | return r |
| 112 | | } | 117 | | } |
| 113 | | func wlResourceGetID(resource uintptr) uint32 { | 118 | | func wlResourceGetID(resource uintptr) uint32 { |
| 114 | - | callArgs[0] = resource | 119 | + | r, _, _ := purego.Syscall6(symResourceGetID, resource, 0, 0, 0, 0, 0) |
| 115 | - | r, _, _ := purego.SyscallN(symResourceGetID, callArgs[:1]...) | | | |
| 116 | | return uint32(r) | 120 | | return uint32(r) |
| 117 | | } | 121 | | } |
| 118 | | func wlResourceSetDispatcher(resource, dispatcher, impl, data, destroy uintptr) { | 122 | | func wlResourceSetDispatcher(resource, dispatcher, impl, data, destroy uintptr) { |
| 119 | - | callArgs[0], callArgs[1], callArgs[2], callArgs[3], callArgs[4] = resource, dispatcher, impl, data, destroy | 123 | + | purego.Syscall6(symResourceSetDispatcher, resource, dispatcher, impl, data, destroy, 0) |
| 120 | - | purego.SyscallN(symResourceSetDispatcher, callArgs[:5]...) | | | |
| 121 | | } | 124 | | } |
| 122 | | func wlResourcePostEventArr(resource uintptr, opcode uint32, args unsafe.Pointer) { | 125 | | func wlResourcePostEventArr(resource uintptr, opcode uint32, args unsafe.Pointer) { |
| 123 | - | callArgs[0], callArgs[1], callArgs[2] = resource, uintptr(opcode), uintptr(args) | 126 | + | purego.Syscall6(symResourcePostEventArr, resource, uintptr(opcode), uintptr(args), 0, 0, 0) |
| 124 | - | purego.SyscallN(symResourcePostEventArr, callArgs[:3]...) | | | |
| 125 | | } | 127 | | } |
| 126 | | func wlResourceDestroy(resource uintptr) { | 128 | | func wlResourceDestroy(resource uintptr) { |
| 127 | - | callArgs[0] = resource | 129 | + | purego.Syscall6(symResourceDestroy, resource, 0, 0, 0, 0, 0) |
| 128 | - | purego.SyscallN(symResourceDestroy, callArgs[:1]...) | | | |
| 129 | | } | 130 | | } |