purego: use sync.Pool in syscall_syscall15X (#328)
This works around the stack growth issue in 05d8da4 by not marking the function as nosplit. This commit uses a pool to cache syscall15Args instances. Otherwise a new instance was allocated on the heap for each purego call.
- commit
- 6dda16a6f8ed36b52fe7ef10ae40e6d1d4dcde7c
- author
- oliverbestmann · · 2025-07-30 23:52 UTC
- committer
- GitHub · · 2025-07-30 23:52 UTC
- parent
- cdb93a8
- signature
- GPG Unverified
B5690EEEBB952194The key is unknown
1 file · +6 -3
M syscall_sysv.go +6 -3
| @@ -14,14 +14,17 @@ import ( | |||
| 14 | 14 | ||
| 15 | 15 | var syscall15XABI0 uintptr | |
| 16 | 16 | ||
| 17 | - | //go:nosplit | |
| 18 | 17 | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | |
| 19 | - | args := syscall15Args{ | |
| 18 | + | args := thePool.Get().(*syscall15Args) | |
| 19 | + | defer thePool.Put(args) | |
| 20 | + | ||
| 21 | + | *args = syscall15Args{ | |
| 20 | 22 | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, | |
| 21 | 23 | a1, a2, a3, a4, a5, a6, a7, a8, | |
| 22 | 24 | 0, | |
| 23 | 25 | } | |
| 24 | - | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&args)) | |
| 26 | + | ||
| 27 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(args)) | |
| 25 | 28 | return args.a1, args.a2, 0 | |
| 26 | 29 | } | |
| 27 | 30 | ||
| @@ -14,14 +14,17 @@ import ( | |||||
| 14 | 14 | ||||
| 15 | var syscall15XABI0 uintptr | 15 | var syscall15XABI0 uintptr | ||
| 16 | 16 | ||||
| 17 | - | //go:nosplit | |||
| 18 | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | 17 | func syscall_syscall15X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { | ||
| 19 | - | args := syscall15Args{ | 18 | + | args := thePool.Get().(*syscall15Args) |
| 19 | + | defer thePool.Put(args) | |||
| 20 | + | ||||
| 21 | + | *args = syscall15Args{ | |||
| 20 | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, | 22 | fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, | ||
| 21 | a1, a2, a3, a4, a5, a6, a7, a8, | 23 | a1, a2, a3, a4, a5, a6, a7, a8, | ||
| 22 | 0, | 24 | 0, | ||
| 23 | } | 25 | } | ||
| 24 | - | runtime_cgocall(syscall15XABI0, unsafe.Pointer(&args)) | 26 | + | |
| 27 | + | runtime_cgocall(syscall15XABI0, unsafe.Pointer(args)) | |||
| 25 | return args.a1, args.a2, 0 | 28 | return args.a1, args.a2, 0 | ||
| 26 | } | 29 | } | ||
| 27 | 30 | ||||