Skip to content

fix(metal): eliminate unsafe.Pointer in block callbacks — map lookup (#293) - #294

Merged
kolkov merged 1 commit into
mainfrom
fix/293-metal-checkptr
Aug 1, 2026
Merged

fix(metal): eliminate unsafe.Pointer in block callbacks — map lookup (#293)#294
kolkov merged 1 commit into
mainfrom
fix/293-metal-checkptr

Conversation

@kolkov

@kolkov kolkov commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Summary

All 4 ObjC block callback trampolines converted uintptr blockPtr to unsafe.Pointer to read blockID. checkptr under -race rejects this — uintptr from goffi has no pointer provenance. wgpu#280 fix (unsafe.Add) was insufficient — base conversion itself invalid.

Replace with blockPtrToID sync.Map reverse lookup (purego/Ebitengine pattern). Block pointer used as opaque integer key. Zero unsafe.Pointer conversions in callbacks.

Test plan

  • Build: native + WASM + Darwin arm64 + Linux amd64
  • All tests pass, 0 failures
  • Lint: 0 issues
  • Feature: 0 remaining unsafe.Pointer(blockPtr) in callbacks
  • macOS -race: needs @jbunds confirmation on Apple Silicon

Fixes #293.

…293)

All 4 ObjC block callbacks converted uintptr blockPtr to unsafe.Pointer
to dereference blockID at offset 32. checkptr rejects this under -race
because uintptr from goffi reflect callback has no pointer provenance.

Replace with blockPtrToID sync.Map reverse lookup — block pointer used
as opaque integer key only. No unsafe.Pointer conversion. Follows
purego (Ebitengine) pattern. wgpu#280 fix was insufficient.

Fixes #293.
@codecov

codecov Bot commented Aug 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@kolkov
kolkov merged commit f49c028 into main Aug 1, 2026
15 checks passed
@jbunds

jbunds commented Aug 1, 2026

Copy link
Copy Markdown

in case this proves helpful in further debugging:

i noticed that the TestDarwinAppRunSmoke test, when executed in isolation from other tests on my MacBook Air M1, opens an application window (an application named "darwin.text" with a main window titled "gogpu") and the test will hang indefinitely, until a human user triggers a device input event (e.g., a keyboard key pressed, or a movement of the mouse pointer)

to reproduce in a clean workspace:

$ cat go.mod
module github.com/gogpu/gogpu

go 1.25.0

require (
github.com/go-webgpu/goffi v0.6.2
github.com/gogpu/gpucontext v0.24.0
github.com/gogpu/gputypes v0.5.1
github.com/gogpu/wgpu v0.30.32
golang.org/x/sys v0.47.0
)

require (
github.com/go-webgpu/webgpu v0.5.4 // indirect
github.com/gogpu/naga v0.17.16 // indirect
)

$ go test -run ^TestDarwinAppRunSmoke$ ./internal/platform/darwin # test will hang until the system receives device input

@jbunds

jbunds commented Aug 1, 2026

Copy link
Copy Markdown

further investigation needed:

$ GOTOOLCHAIN=go1.25.0 go test -race ./internal/platform/darwin
go: downloading go1.25.0 (darwin/arm64)
starting TestDarwinAppRunSmoke
2026/08/01 16:23:21 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunNoDraw
2026/08/01 16:23:30 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunPanicOnUpdate
2026/08/01 16:23:33 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunPanicOnDrawNoTriangle
2026/08/01 16:23:33 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
fatal error: checkptr: converted pointer straddles multiple allocations

goroutine 45 gp=0xc0000036c0 m=4 mp=0xc000057808 [running]:
runtime.throw({0x10070ca71?, 0xc000253270?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/panic.go:1094 +0x34 fp=0xc000253280 sp=0xc000253250 pc=0x1002ca734
runtime.checkptrAlignment(0x100b02cc0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/checkptr.go:26 +0x70 fp=0xc0002532a0 sp=0xc000253280 pc=0x100263220
github.com/go-webgpu/goffi/internal/arch/arm64.(*Implementation).handleHFAReturn(0x0?, 0xc00033ec30, 0xc00033d160, {0x4084000000000000, 0x407e000000000000, 0x0, 0x0})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/internal/arch/arm64/implementation.go:143 +0x140 fp=0xc000253320 sp=0xc0002532a0 pc=0x1003f80b0
github.com/go-webgpu/goffi/internal/arch/arm64.(*Implementation).handleReturn(0x100b3f740, 0xc00033ec30, 0xc00033d160, 0xc81a60b40, 0x203a0115c, {0x4084000000000000, 0x407e000000000000, 0x0, 0x0})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/internal/arch/arm64/implementation.go:63 +0x428 fp=0xc0002533b0 sp=0xc000253320 pc=0x1003f7f08
github.com/go-webgpu/goffi/internal/arch/arm64.(*Implementation).Execute(0x100b3f740, 0xc00033ec30, 0x1898a9800, 0xc00033d160, {0xc000334cb0, 0x2, 0x2}, 0x1003f3b10)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/internal/arch/arm64/call_arm64.go:321 +0xeb8 fp=0xc000253760 sp=0xc0002533b0 pc=0x1003f6078
github.com/go-webgpu/goffi/ffi.executeFunction(0xc00033ec30, 0x1898a9800, 0xc00033d160, {0xc000334cb0, 0x2, 0x2})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/ffi/call.go:26 +0xa8 fp=0xc0002537d0 sp=0xc000253760 pc=0x1003f8448
github.com/go-webgpu/goffi/ffi.CallFunctionContext({0x10088b2d8, 0x100b3f740}, 0xc00033ec30, 0x1898a9800, 0xc00033d160, {0xc000334cb0, 0x2, 0x2})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/ffi/ffi.go:283 +0x128 fp=0xc000253840 sp=0xc0002537d0 pc=0x1003fb918
github.com/go-webgpu/goffi/ffi.CallFunction(...)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.2/ffi/ffi.go:329
github.com/gogpu/gogpu/internal/platform/darwin_test.objcCall(0xc000203a40, 0xc00023c870, 0x100b02cc0, 0xc00033d160, 0xc81a60b40, 0x203a0115c, {0x0, 0x0, 0x0})
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:285 +0x4ec fp=0xc000253950 sp=0xc000253840 pc=0x1006d108c
github.com/gogpu/gogpu/internal/platform/darwin_test.objcCallRet[...](0xc000203a40, 0xc00023c870, 0xc81a60b40, 0x203a0115c, {0x0, 0x0, 0x0})
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:319 +0x2c0 fp=0xc0002539e0 sp=0xc000253950 pc=0x1006dbe90
github.com/gogpu/gogpu/internal/platform/darwin_test.TestDarwinCAMetalLayerProperties.func1()
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:802 +0x5c4 fp=0xc000253cb0 sp=0xc0002539e0 pc=0x1006d4694
github.com/gogpu/gogpu/internal/platform/darwin_test.withAutoreleasePool(0xc000203a40, 0xc00023c870, 0xc000253e80)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:363 +0x170 fp=0xc000253d90 sp=0xc000253cb0 pc=0x1006d16a0
github.com/gogpu/gogpu/internal/platform/darwin_test.TestDarwinCAMetalLayerProperties(0xc000203a40)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:772 +0x380 fp=0xc000253ec0 sp=0xc000253d90 pc=0x1006d4090
testing.tRunner(0xc000203a40, 0x1008845c8)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1934 +0x168 fp=0xc000253fa0 sp=0xc000253ec0 pc=0x100373188
testing.(*T).Run.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1997 +0x40 fp=0xc000253fd0 sp=0xc000253fa0 pc=0x1003746e0
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000253fd0 sp=0xc000253fd0 pc=0x1002d2524
created by testing.(*T).Run in goroutine 23
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1997 +0x6e4

goroutine 1 gp=0xc0000021c0 m=nil [chan receive, locked to thread]:
runtime.gopark(0x0?, 0x0?, 0x40?, 0x14?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc00011bd40 sp=0xc00011bd20 pc=0x1002ca850
runtime.chanrecv(0xc0000a20e0, 0xc00011be40, 0x1)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:667 +0x3ac fp=0xc00011bdd0 sp=0xc00011bd40 pc=0x10026292c
runtime.chanrecv2(0x1006f540f?, 0x1?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:514 +0x14 fp=0xc00011be00 sp=0xc00011bdd0 pc=0x100262564
github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain(0xc0000b0140)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:96 +0x1c0 fp=0xc00011be50 sp=0xc00011be00 pc=0x1006d03f0
main.main()
_testmain.go:133 +0x108 fp=0xc00011bf40 sp=0xc00011be50 pc=0x1006dd5d8
runtime.main()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:285 +0x278 fp=0xc00011bfd0 sp=0xc00011bf40 pc=0x100295248
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc00011bfd0 sp=0xc00011bfd0 pc=0x1002d2524

goroutine 18 gp=0xc00008a380 m=nil [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc00004c790 sp=0xc00004c770 pc=0x1002ca850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.forcegchelper()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:373 +0xb4 fp=0xc00004c7d0 sp=0xc00004c790 pc=0x100295594
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc00004c7d0 sp=0xc00004c7d0 pc=0x1002d2524
created by runtime.init.7 in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:361 +0x24

goroutine 19 gp=0xc00008a540 m=nil [GC sweep wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000066f60 sp=0xc000066f40 pc=0x1002ca850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.bgsweep(0xc00009a000)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcsweep.go:279 +0x9c fp=0xc000066fb0 sp=0xc000066f60 pc=0x10027e9ec
runtime.gcenable.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:212 +0x28 fp=0xc000066fd0 sp=0xc000066fb0 pc=0x1002726b8
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000066fd0 sp=0xc000066fd0 pc=0x1002d2524
created by runtime.gcenable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:212 +0x6c

goroutine 20 gp=0xc00008a700 m=nil [GC scavenge wait]:
runtime.gopark(0xc00009a000?, 0x100796e00?, 0x1?, 0x0?, 0xc00008a700?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000060f60 sp=0xc000060f40 pc=0x1002ca850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.(*scavengerState).park(0x100b0cd60)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcscavenge.go:425 +0x5c fp=0xc000060f90 sp=0xc000060f60 pc=0x10027c57c
runtime.bgscavenge(0xc00009a000)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcscavenge.go:653 +0x44 fp=0xc000060fb0 sp=0xc000060f90 pc=0x10027cab4
runtime.gcenable.gowrap2()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:213 +0x28 fp=0xc000060fd0 sp=0xc000060fb0 pc=0x100272658
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000060fd0 sp=0xc000060fd0 pc=0x1002d2524
created by runtime.gcenable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:213 +0xac

goroutine 21 gp=0xc00008a8c0 m=nil [GOMAXPROCS updater (idle)]:
runtime.gopark(0x1?, 0xc00008a700?, 0xa8?, 0xd7?, 0x100272658?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc00004d770 sp=0xc00004d750 pc=0x1002ca850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.updateMaxProcsGoroutine()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:6706 +0xf4 fp=0xc00004d7d0 sp=0xc00004d770 pc=0x1002a41e4
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc00004d7d0 sp=0xc00004d7d0 pc=0x1002d2524
created by runtime.defaultGOMAXPROCSUpdateEnable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:6694 +0x48

goroutine 22 gp=0xc00008ae00 m=nil [finalizer wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000067d80 sp=0xc000067d60 pc=0x1002ca850
runtime.runFinalizers()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mfinal.go:210 +0x124 fp=0xc000067fd0 sp=0xc000067d80 pc=0x100271754
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000067fd0 sp=0xc000067fd0 pc=0x1002d2524
created by runtime.createfing in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mfinal.go:172 +0x78

goroutine 23 gp=0xc00008afc0 m=nil [chan receive]:
runtime.gopark(0x300196000?, 0x14bb0db88?, 0x78?, 0x8a?, 0x18?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0000c3780 sp=0xc0000c3760 pc=0x1002ca850
runtime.chanrecv(0xc0002ea580, 0xc0000c388e, 0x1)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:667 +0x3ac fp=0xc0000c3810 sp=0xc0000c3780 pc=0x10026292c
runtime.chanrecv1(0x100b0c660?, 0x1007e3d60?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:509 +0x14 fp=0xc0000c3840 sp=0xc0000c3810 pc=0x100262544
testing.(*T).Run(0xc000003340, {0x100700f6e, 0x20}, 0x1008845c8)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2005 +0x700 fp=0xc0000c3980 sp=0xc0000c3840 pc=0x100374500
testing.runTests.func1(0xc000003340)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2477 +0x78 fp=0xc0000c39d0 sp=0xc0000c3980 pc=0x100377988
testing.tRunner(0xc000003340, 0xc0000c3bf8)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1934 +0x168 fp=0xc0000c3ab0 sp=0xc0000c39d0 pc=0x100373188
testing.runTests(0xc00000e018, {0x100b08060, 0x2b, 0x2b}, {0x0?, 0x0?, 0x100b0cce0?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2475 +0x738 fp=0xc0000c3c20 sp=0xc0000c3ab0 pc=0x100377848
testing.(*M).Run(0xc0000b0140)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2337 +0xaf8 fp=0xc0000c3f90 sp=0xc0000c3c20 pc=0x100375798
github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain.func1()
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:92 +0x34 fp=0xc0000c3fd0 sp=0xc0000c3f90 pc=0x1006d0464
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0000c3fd0 sp=0xc0000c3fd0 pc=0x1002d2524
created by github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain in goroutine 1
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:91 +0x184
FAIL github.com/gogpu/gogpu/internal/platform/darwin 11.770s
FAIL

@kolkov

kolkov commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed reports, @jbunds.

Your first checkptr crash (block callbacks) is fixed in this PR (v0.30.31) — all 4 ObjC block trampolines now use a map lookup instead of unsafe.Pointer conversion. Your first 3 tests passing confirms the fix works.

The second crash (TestDarwinCAMetalLayerProperties) is a separate bug in goffi, not wgpu. The stack trace shows handleHFAReturn at implementation.go:143 — goffi unconditionally casts the return buffer to (*[4]float64) even when the HFA has only 2 elements (e.g., CGSize). This makes the cast span beyond the allocation, triggering checkptr.

We reported it: go-webgpu/goffi#67

Already fixed and released: goffi v0.6.3 — https://github.com/go-webgpu/goffi/releases/tag/v0.6.3

We'll bump wgpu's goffi dep to v0.6.3 in the next patch. After that, go test -race on macOS ARM64 should work for both block callbacks and ObjC method returns.

Regarding TestDarwinAppRunSmoke hanging until user input — that's a gogpu test lifecycle issue (event loop not auto-terminating). Separate from checkptr.

@jbunds

jbunds commented Aug 2, 2026

Copy link
Copy Markdown

I've just sync'ed my workspace with HEAD on upstream main:

$ git --no-pager log -n 1 --format='%H %d' HEAD upstream/main
2c20505bfcee791cc986312bbda672c72975e747 (HEAD -> fix_issue_406, upstream/main, upstream/HEAD)

$ git diff upstream/main..HEAD # null output

$ go clean -testcache

$ GOTOOLCHAIN=go1.25.0 go test -race ./internal/platform/darwin
starting TestDarwinAppRunSmoke
2026/08/02 10:45:38 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunNoDraw
2026/08/02 10:45:40 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunPanicOnUpdate
2026/08/02 10:45:41 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
starting TestDarwinAppRunPanicOnDrawNoTriangle
2026/08/02 10:45:41 INFO adapter selected name="Apple M1" backend=Metal type=DiscreteGPU
fatal error: checkptr: pointer arithmetic result points to invalid allocation

goroutine 1 gp=0xc0000021c0 m=0 mp=0x104f1db40 [running, locked to thread]:
runtime.throw({0x104b1e431?, 0x0?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/panic.go:1094 +0x34 fp=0xc00002c820 sp=0xc00002c7f0 pc=0x1046da734
runtime.checkptrArithmetic(0x104c9b2f8?, {0x0, 0x0, 0x1898b4230?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/checkptr.go:69 +0xa8 fp=0xc00002c850 sp=0xc00002c820 pc=0x104673398
github.com/gogpu/gogpu/internal/platform/darwin.GetAssociatedObject(0xb3b15b790, 0x104f0fd80)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/objc.go:1391 +0x2cc fp=0xc00002c8e0 sp=0xc00002c850 pc=0x10481de6c
github.com/gogpu/gogpu/internal/platform/darwin.getWindowFromDelegate(...)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/windowdelegate.go:149
github.com/gogpu/gogpu/internal/platform/darwin.registerWindowDelegateClass.func3(0xb3b15b790, 0x1047341dc?, 0xc00002c958?)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/windowdelegate.go:85 +0x34 fp=0xc00002c920 sp=0xc00002c8e0 pc=0x104824b94
runtime.call32(0xc0000920c0, 0x104c949a8, 0x0, 0x0, 0x0, 0x18, 0xc00002cc58)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:555 +0x78 fp=0xc00002c950 sp=0xc00002c920 pc=0x1046e0618
runtime.reflectcall(0xc00002cc58?, 0x2?, 0x8?, 0x6b7ddb70?, 0x1?, 0x12?, 0x104bf4040?)
:1 +0x2c fp=0xc00002c990 sp=0xc00002c950 pc=0x1046e513c
reflect.Value.call({0x104c0f680?, 0x104c949a8?, 0xc00002d0c8?}, {0x104b008c6, 0x4}, {0xc0001da550, 0x3, 0x50?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/reflect/value.go:581 +0x928 fp=0xc00002d0a0 sp=0xc00002c990 pc=0x10473a118
reflect.Value.Call({0x104c0f680?, 0x104c949a8?, 0xc00002d188?}, {0xc0001da550, 0x3, 0x3})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/reflect/value.go:365 +0x94 fp=0xc00002d130 sp=0xc00002d0a0 pc=0x104739724
github.com/go-webgpu/goffi/ffi.callbackWrap(0x16b7ddae8)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/ffi/callback_arm64.go:225 +0x8ec fp=0xc00002d2b0 sp=0xc00002d130 pc=0x1048092dc
runtime.cgocallbackg1(0x1048089f0, 0x16b7ddae8, 0x0)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/cgocall.go:446 +0x24c fp=0xc00002d380 sp=0xc00002d2b0 pc=0x1046711fc
runtime.cgocallbackg(0x1048089f0, 0x16b7ddae8, 0x0)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/cgocall.go:350 +0x104 fp=0xc00002d3f0 sp=0xc00002d380 pc=0x104670ee4
runtime.cgocallbackg(0x1048089f0, 0x16b7ddae8, 0x0)
:1 +0x1c fp=0xc00002d420 sp=0xc00002d3f0 pc=0x1046e4aac
runtime.cgocallback(0xc00002d498, 0x104803948, 0x104803b20)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1180 +0xb0 fp=0xc00002d450 sp=0xc00002d420 pc=0x1046e2440
runtime.systemstack_switch()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:249 +0x8 fp=0xc00002d460 sp=0xc00002d450 pc=0x1046dffd8
runtime.cgocall(0x104803b20, 0xc00013ed80)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/cgocall.go:185 +0x80 fp=0xc00002d4a0 sp=0xc00002d460 pc=0x1046d8170
github.com/go-webgpu/goffi/internal/syscall.CallNFloatErrno(0x1898a9800, {0xb3a60ed00, 0x203ac4a28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, {0x4084080000000000, ...}, ...)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/internal/syscall/syscall_arm64.go:158 +0x208 fp=0xc00002d660 sp=0xc00002d4a0 pc=0x104803948
github.com/go-webgpu/goffi/internal/arch/arm64.(*Implementation).Execute(0x104f4f740, 0xc0001da500, 0x1898a9800, 0xc000096378, {0xc0003202e8, 0x3, 0x3}, 0x104803b10)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/internal/arch/arm64/call_arm64.go:316 +0xe34 fp=0xc00002da10 sp=0xc00002d660 pc=0x104805ff4
github.com/go-webgpu/goffi/ffi.executeFunction(0xc0001da500, 0x1898a9800, 0xc000096378, {0xc0003202e8, 0x3, 0x3})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/ffi/call.go:26 +0xa8 fp=0xc00002da80 sp=0xc00002da10 pc=0x104808378
github.com/go-webgpu/goffi/ffi.CallFunctionContext({0x104c9b2f8, 0x104f4f740}, 0xc0001da500, 0x1898a9800, 0xc000096378, {0xc0003202e8, 0x3, 0x3})
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/ffi/ffi.go:283 +0x128 fp=0xc00002daf0 sp=0xc00002da80 pc=0x10480b848
github.com/go-webgpu/goffi/ffi.CallFunction(...)
/Users/jeff/personal/dev/go/pkg/mod/github.com/go-webgpu/goffi@v0.6.3/ffi/ffi.go:329
github.com/gogpu/gogpu/internal/platform/darwin.ID.SendSize(0xb3a60ed00, 0x203ac4a28, {0xc00002db40?, 0x104820e94?})
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/objc.go:1193 +0x370 fp=0xc00002dba0 sp=0xc00002daf0 pc=0x10481cb40
github.com/gogpu/gogpu/internal/platform/darwin.(*Window).SetSize(0xc0000b6000, 0x281, 0x1e1)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/window.go:286 +0x108 fp=0xc00002dc20 sp=0xc00002dba0 pc=0x104821418
github.com/gogpu/gogpu/internal/platform/darwin_test.TestDarwinGogpuWindowSurfaceStress.func1()
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:988 +0x2b0 fp=0xc00002dd80 sp=0xc00002dc20 pc=0x104ae6ce0
github.com/gogpu/gogpu/internal/platform/darwin_test.runOnMainThread.func1()
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:342 +0x8c fp=0xc00002de00 sp=0xc00002dd80 pc=0x104ae1c9c
github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain(0xc000112140)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:97 +0x1b4 fp=0xc00002de50 sp=0xc00002de00 pc=0x104ae0c34
main.main()
_testmain.go:133 +0x108 fp=0xc00002df40 sp=0xc00002de50 pc=0x104aede28
runtime.main()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:285 +0x278 fp=0xc00002dfd0 sp=0xc00002df40 pc=0x1046a5248
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc00002dfd0 sp=0xc00002dfd0 pc=0x1046e2524

goroutine 2 gp=0xc000002c40 m=nil [force gc (idle)]:
runtime.gopark(0x0?, 0x104ef14d0?, 0x40?, 0xdb?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000050790 sp=0xc000050770 pc=0x1046da850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.forcegchelper()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:373 +0xb4 fp=0xc0000507d0 sp=0xc000050790 pc=0x1046a5594
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0000507d0 sp=0xc0000507d0 pc=0x1046e2524
created by runtime.init.7 in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:361 +0x24

goroutine 3 gp=0xc000003180 m=nil [GC sweep wait]:
runtime.gopark(0x1?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000066f60 sp=0xc000066f40 pc=0x1046da850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.bgsweep(0xc00007c000)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcsweep.go:323 +0x104 fp=0xc000066fb0 sp=0xc000066f60 pc=0x10468ea54
runtime.gcenable.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:212 +0x28 fp=0xc000066fd0 sp=0xc000066fb0 pc=0x1046826b8
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000066fd0 sp=0xc000066fd0 pc=0x1046e2524
created by runtime.gcenable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:212 +0x6c

goroutine 4 gp=0xc000003340 m=nil [sleep]:
runtime.gopark(0xc000090000?, 0x1184e34052a09?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000060f20 sp=0xc000060f00 pc=0x1046da850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.(*scavengerState).sleep(0x104f1cd60, 0x409df40000000000)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcscavenge.go:504 +0x108 fp=0xc000060f90 sp=0xc000060f20 pc=0x10468c758
runtime.bgscavenge(0xc00007c000)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgcscavenge.go:662 +0x9c fp=0xc000060fb0 sp=0xc000060f90 pc=0x10468cb0c
runtime.gcenable.gowrap2()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:213 +0x28 fp=0xc000060fd0 sp=0xc000060fb0 pc=0x104682658
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000060fd0 sp=0xc000060fd0 pc=0x1046e2524
created by runtime.gcenable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:213 +0xac

goroutine 5 gp=0xc000003880 m=nil [GOMAXPROCS updater (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000050f70 sp=0xc000050f50 pc=0x1046da850
runtime.goparkunlock(...)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:466
runtime.updateMaxProcsGoroutine()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:6706 +0xf4 fp=0xc000050fd0 sp=0xc000050f70 pc=0x1046b41e4
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000050fd0 sp=0xc000050fd0 pc=0x1046e2524
created by runtime.defaultGOMAXPROCSUpdateEnable in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:6694 +0x48

goroutine 6 gp=0xc000003dc0 m=nil [finalizer wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000061d80 sp=0xc000061d60 pc=0x1046da850
runtime.runFinalizers()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mfinal.go:210 +0x124 fp=0xc000061fd0 sp=0xc000061d80 pc=0x104681754
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000061fd0 sp=0xc000061fd0 pc=0x1046e2524
created by runtime.createfing in goroutine 1
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mfinal.go:172 +0x78

goroutine 7 gp=0xc00015e000 m=nil [chan receive]:
runtime.gopark(0x3000b2000?, 0x1156a8970?, 0xc0?, 0x5?, 0x18?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc00011d780 sp=0xc00011d760 pc=0x1046da850
runtime.chanrecv(0xc0000aa080, 0xc00011d88e, 0x1)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:667 +0x3ac fp=0xc00011d810 sp=0xc00011d780 pc=0x10467292c
runtime.chanrecv1(0x104f1c660?, 0x104bf3d80?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:509 +0x14 fp=0xc00011d840 sp=0xc00011d810 pc=0x104672544
testing.(*T).Run(0xc000082380, {0x104b1306e, 0x22}, 0x104c94600)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2005 +0x700 fp=0xc00011d980 sp=0xc00011d840 pc=0x104784500
testing.runTests.func1(0xc000082380)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2477 +0x78 fp=0xc00011d9d0 sp=0xc00011d980 pc=0x104787988
testing.tRunner(0xc000082380, 0xc00011dbf8)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1934 +0x168 fp=0xc00011dab0 sp=0xc00011d9d0 pc=0x104783188
testing.runTests(0xc0000a4000, {0x104f18060, 0x2b, 0x2b}, {0x0?, 0x0?, 0x104f1cce0?})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2475 +0x738 fp=0xc00011dc20 sp=0xc00011dab0 pc=0x104787848
testing.(*M).Run(0xc000112140)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:2337 +0xaf8 fp=0xc00011df90 sp=0xc00011dc20 pc=0x104785798
github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain.func1()
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:92 +0x34 fp=0xc00011dfd0 sp=0xc00011df90 pc=0x104ae0cb4
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc00011dfd0 sp=0xc00011dfd0 pc=0x1046e2524
created by github.com/gogpu/gogpu/internal/platform/darwin_test.TestMain in goroutine 1
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:91 +0x184

goroutine 54 gp=0xc000082700 m=nil [chan receive]:
runtime.gopark(0xc0001c4e08?, 0x1046715f8?, 0xc0?, 0x61?, 0xc0001c8000?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0001c4d80 sp=0xc0001c4d60 pc=0x1046da850
runtime.chanrecv(0xc0001ba070, 0x0, 0x1)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:667 +0x3ac fp=0xc0001c4e10 sp=0xc0001c4d80 pc=0x10467292c
runtime.chanrecv1(0xc000182380?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/chan.go:509 +0x14 fp=0xc0001c4e40 sp=0xc0001c4e10 pc=0x104672544
github.com/gogpu/gogpu/internal/platform/darwin_test.runOnMainThread(0xc000182380, 0xc0003dc030)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:344 +0x178 fp=0xc0001c4e90 sp=0xc0001c4e40 pc=0x104ae1bb8
github.com/gogpu/gogpu/internal/platform/darwin_test.TestDarwinGogpuWindowSurfaceStress(0xc000182380)
/Users/jeff/personal/dev/go/src/fix_issue_406/internal/platform/darwin/darwin_objc_test.go:968 +0x84 fp=0xc0001c4ec0 sp=0xc0001c4e90 pc=0x104ae6a04
testing.tRunner(0xc000182380, 0x104c94600)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1934 +0x168 fp=0xc0001c4fa0 sp=0xc0001c4ec0 pc=0x104783188
testing.(*T).Run.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1997 +0x40 fp=0xc0001c4fd0 sp=0xc0001c4fa0 pc=0x1047846e0
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0001c4fd0 sp=0xc0001c4fd0 pc=0x1046e2524
created by testing.(*T).Run in goroutine 7
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/testing/testing.go:1997 +0x6e4

goroutine 10 gp=0xc00015e1c0 m=nil [GC worker (idle)]:
runtime.gopark(0x1184dce7d01b0?, 0x3?, 0x3a?, 0x27?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000358f10 sp=0xc000358ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc000358fb0 sp=0xc000358f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc000358fd0 sp=0xc000358fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000358fd0 sp=0xc000358fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 11 gp=0xc00015e8c0 m=nil [GC worker (idle)]:
runtime.gopark(0x1184dce7cfb2d?, 0x1?, 0xfc?, 0xc2?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000357f10 sp=0xc000357ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc000357fb0 sp=0xc000357f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc000357fd0 sp=0xc000357fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000357fd0 sp=0xc000357fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 32 gp=0xc000083180 m=nil [GC worker (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0001c3f10 sp=0xc0001c3ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc0001c3fb0 sp=0xc0001c3f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc0001c3fd0 sp=0xc0001c3fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0001c3fd0 sp=0xc0001c3fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 33 gp=0xc000342540 m=nil [GC worker (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0001c2f10 sp=0xc0001c2ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc0001c2fb0 sp=0xc0001c2f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc0001c2fd0 sp=0xc0001c2fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0001c2fd0 sp=0xc0001c2fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 51 gp=0xc000342700 m=nil [GC worker (idle)]:
runtime.gopark(0x0?, 0x0?, 0x58?, 0x17?, 0x10468c3b4?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0001c1f10 sp=0xc0001c1ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc0001c1fb0 sp=0xc0001c1f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc0001c1fd0 sp=0xc0001c1fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0001c1fd0 sp=0xc0001c1fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 52 gp=0xc0003428c0 m=nil [GC worker (idle)]:
runtime.gopark(0x1184dce7cfb80?, 0x1?, 0x2b?, 0xd0?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc0001c0f10 sp=0xc0001c0ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc0001c0fb0 sp=0xc0001c0f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc0001c0fd0 sp=0xc0001c0fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc0001c0fd0 sp=0xc0001c0fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 53 gp=0xc000342a80 m=nil [GC worker (idle)]:
runtime.gopark(0x1184dcc1476ba?, 0x3?, 0xbd?, 0x26?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000359f10 sp=0xc000359ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc000359fb0 sp=0xc000359f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc000359fd0 sp=0xc000359fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000359fd0 sp=0xc000359fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140

goroutine 12 gp=0xc00015ea80 m=nil [GC worker (idle)]:
runtime.gopark(0x1184dce7cfe98?, 0x1?, 0x2e?, 0x9f?, 0x0?)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/proc.go:460 +0xc0 fp=0xc000356f10 sp=0xc000356ef0 pc=0x1046da850
runtime.gcBgMarkWorker(0xc0000a8a10)
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1463 +0xe0 fp=0xc000356fb0 sp=0xc000356f10 pc=0x104684d30
runtime.gcBgMarkStartWorkers.gowrap1()
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x28 fp=0xc000356fd0 sp=0xc000356fb0 pc=0x104684c18
runtime.goexit({})
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/asm_arm64.s:1268 +0x4 fp=0xc000356fd0 sp=0xc000356fd0 pc=0x1046e2524
created by runtime.gcBgMarkStartWorkers in goroutine 31
/Users/jeff/personal/dev/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.25.0.darwin-arm64/src/runtime/mgc.go:1373 +0x140
FAIL github.com/gogpu/gogpu/internal/platform/darwin 3.434s
FAIL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: Metal block callbacks crash under -race (checkptr) — wgpu#280 fix insufficient

2 participants