Open rcoreilly opened 1 week ago
race in Sprite access between cursor and render. presumably need to do async lock on cursor.
run cogent/code with race detector:
go build -race -gcflags=all=-d=checkptr=0
do it.
================== ================== WARNING: DATA RACE Read at 0x00c008c961e0 by goroutine 399: cogentcore.org/core/core.(*Sprites).DrawSprites() /Users/oreilly/go/src/cogentcore.org/core/core/sprite.go:319 +0x15c cogentcore.org/core/core.(*RenderWindow).DrawScenes() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:887 +0x2bc cogentcore.org/core/core.(*RenderWindow).RenderWindow() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:844 +0x34c cogentcore.org/core/core.(*RenderWindow).HandleWindowEvents() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:504 +0x61c cogentcore.org/core/core.(*RenderWindow).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:488 +0x168 cogentcore.org/core/core.(*RenderWindow).EventLoop() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:456 +0xd0 cogentcore.org/core/core.(*RenderWindow).GoStartEventLoop.gowrap1() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:415 +0x34 Previous write at 0x00c008c961e0 by goroutine 1620: cogentcore.org/core/core.(*Sprites).ActivateSprite() /Users/oreilly/go/src/cogentcore.org/core/core/sprite.go:259 +0x3cc cogentcore.org/core/texteditor.(*Editor).CursorSprite() /Users/oreilly/go/src/cogentcore.org/core/texteditor/cursor.go:149 +0x380 cogentcore.org/core/texteditor.(*Editor).RenderCursor() /Users/oreilly/go/src/cogentcore.org/core/texteditor/cursor.go:111 +0x31c cogentcore.org/core/texteditor.init.0.func1() /Users/oreilly/go/src/cogentcore.org/core/texteditor/cursor.go:39 +0x1b4 cogentcore.org/core/core.(*Blinker).BlinkLoop() /Users/oreilly/go/src/cogentcore.org/core/core/blinker.go:81 +0x1ec cogentcore.org/core/core.(*Blinker).Blink.gowrap2() /Users/oreilly/go/src/cogentcore.org/core/core/blinker.go:37 +0x34 Goroutine 399 (running) created at: cogentcore.org/core/core.(*RenderWindow).GoStartEventLoop() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:415 +0x94 cogentcore.org/core/core.(*Stage).RunWindow() /Users/oreilly/go/src/cogentcore.org/core/core/mainstage.go:211 +0x7cc cogentcore.org/core/core.(*Stage).RunImpl() /Users/oreilly/go/src/cogentcore.org/core/core/stage.go:300 +0x7c cogentcore.org/core/core.(*Stage).Run() /Users/oreilly/go/src/cogentcore.org/core/core/stage.go:279 +0xc8 cogentcore.org/core/core.(*Body).RunWindow() /Users/oreilly/go/src/cogentcore.org/core/core/mainstage.go:49 +0x68 cogentcore.org/cogent/code.NewCodeWindow() /Users/oreilly/go/src/cogentcore.org/cogent/code/code.go:681 +0x328 cogentcore.org/cogent/code.OpenCodeProject() /Users/oreilly/go/src/cogentcore.org/cogent/code/code.go:649 +0x144 cogentcore.org/cogent/code.(*Code).OpenProject() /Users/oreilly/go/src/cogentcore.org/cogent/code/code.go:409 +0x580 cogentcore.org/cogent/code.(*Code).OpenRecent() /Users/oreilly/go/src/cogentcore.org/cogent/code/code.go:331 +0xb4 cogentcore.org/cogent/code.(*Code).MakeToolbar.func5.1.1() /Users/oreilly/go/src/cogentcore.org/cogent/code/appbar.go:52 +0x44 cogentcore.org/core/events.(*Listeners).Call() /Users/oreilly/go/src/cogentcore.org/core/events/listeners.go:61 +0x12c cogentcore.org/core/core.(*WidgetBase).HandleEvent.func1() /Users/oreilly/go/src/cogentcore.org/core/core/widgetevents.go:236 +0x90 cogentcore.org/core/base/tiered.(*Tiered[go.shape.map[cogentcore.org/core/events.Types][]func(cogentcore.org/core/events.Event)]).Do() /Users/oreilly/go/src/cogentcore.org/core/base/tiered/tiered.go:30 +0x64 cogentcore.org/core/core.(*WidgetBase).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/widgetevents.go:235 +0x1cc cogentcore.org/core/core.(*WidgetBase).Send() /Users/oreilly/go/src/cogentcore.org/core/core/widgetevents.go:179 +0x134 cogentcore.org/core/core.(*Events).HandlePosEvent() /Users/oreilly/go/src/cogentcore.org/core/core/events.go:464 +0x1e80 cogentcore.org/core/core.(*Events).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/events.go:174 +0x60 cogentcore.org/core/core.(*Stage).PopupHandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/popupstage.go:188 +0xdc cogentcore.org/core/core.(*Stages).PopupHandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/popupstage.go:233 +0x1e0 cogentcore.org/core/core.(*Stage).MainHandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/mainstage.go:344 +0x6c cogentcore.org/core/core.(*Stages).MainHandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/mainstage.go:360 +0xa8 cogentcore.org/core/core.(*RenderWindow).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:493 +0x198 cogentcore.org/core/core.(*RenderWindow).EventLoop() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:456 +0xd0 cogentcore.org/core/core.(*RenderWindow).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:488 +0x168 cogentcore.org/core/core.(*RenderWindow).EventLoop() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:456 +0xd0 cogentcore.org/core/core.(*RenderWindow).GoStartEventLoop.gowrap1() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:415 +0x34 Goroutine 1620 (running) created at: cogentcore.org/core/core.(*Blinker).Blink() /Users/oreilly/go/src/cogentcore.org/core/core/blinker.go:37 +0x194 cogentcore.org/core/texteditor.(*Editor).StartCursor() /Users/oreilly/go/src/cogentcore.org/core/texteditor/cursor.go:58 +0x1fc cogentcore.org/core/texteditor.(*Editor).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/texteditor/render.go:52 +0x15c cogentcore.org/cogent/code.(*TextEditor).RenderWidget() <autogenerated>:1 +0x34 cogentcore.org/core/core.(*Frame).RenderChildren.func1() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:187 +0x34 cogentcore.org/core/core.(*WidgetBase).WidgetKidsIter() /Users/oreilly/go/src/cogentcore.org/core/core/widget.go:468 +0xe8 cogentcore.org/core/core.(*Frame).RenderChildren() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:186 +0x70 cogentcore.org/core/core.(*Frame).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:196 +0x100 cogentcore.org/core/core.(*Splits).RenderWidget.func1() /Users/oreilly/go/src/cogentcore.org/core/core/splits.go:320 +0xec cogentcore.org/core/core.(*WidgetBase).WidgetKidsIter() /Users/oreilly/go/src/cogentcore.org/core/core/widget.go:468 +0xe8 cogentcore.org/core/core.(*Splits).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/core/splits.go:313 +0x60 cogentcore.org/core/core.(*Frame).RenderChildren.func1() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:187 +0x34 cogentcore.org/core/core.(*WidgetBase).WidgetKidsIter() /Users/oreilly/go/src/cogentcore.org/core/core/widget.go:468 +0xe8 cogentcore.org/core/core.(*Frame).RenderChildren() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:186 +0x70 cogentcore.org/core/core.(*Frame).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:196 +0x100 cogentcore.org/cogent/code.(*Code).RenderWidget() <autogenerated>:1 +0x34 cogentcore.org/core/core.(*Frame).RenderChildren.func1() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:187 +0x34 cogentcore.org/core/core.(*WidgetBase).WidgetKidsIter() /Users/oreilly/go/src/cogentcore.org/core/core/widget.go:468 +0xe8 cogentcore.org/core/core.(*Frame).RenderChildren() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:186 +0x70 cogentcore.org/core/core.(*Frame).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:196 +0x100 cogentcore.org/core/core.(*Body).RenderWidget() <autogenerated>:1 +0x34 cogentcore.org/core/core.(*Frame).RenderChildren.func1() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:187 +0x34 cogentcore.org/core/core.(*WidgetBase).WidgetKidsIter() /Users/oreilly/go/src/cogentcore.org/core/core/widget.go:468 +0xe8 cogentcore.org/core/core.(*Frame).RenderChildren() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:186 +0x70 cogentcore.org/core/core.(*Frame).RenderWidget() /Users/oreilly/go/src/cogentcore.org/core/core/frame.go:196 +0x100 cogentcore.org/core/core.(*Scene).LayoutRenderScene() /Users/oreilly/go/src/cogentcore.org/core/core/render.go:177 +0x34 cogentcore.org/core/core.(*Scene).DoUpdate() /Users/oreilly/go/src/cogentcore.org/core/core/render.go:238 +0x450 cogentcore.org/core/core.(*Stage).DoUpdate() /Users/oreilly/go/src/cogentcore.org/core/core/stage.go:324 +0xbc cogentcore.org/core/core.(*Stages).UpdateAll() /Users/oreilly/go/src/cogentcore.org/core/core/stages.go:288 +0x14c cogentcore.org/core/core.(*RenderWindow).RenderWindow() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:823 +0xc0 cogentcore.org/core/core.(*RenderWindow).HandleWindowEvents() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:504 +0x61c cogentcore.org/core/core.(*RenderWindow).HandleEvent() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:488 +0x168 cogentcore.org/core/core.(*RenderWindow).EventLoop() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:456 +0xd0 cogentcore.org/core/core.(*RenderWindow).GoStartEventLoop.gowrap1() /Users/oreilly/go/src/cogentcore.org/core/core/renderwindow.go:415 +0x34
No response
macOS
Describe the bug
race in Sprite access between cursor and render. presumably need to do async lock on cursor.
run cogent/code with race detector:
How to reproduce
do it.
Example code
Relevant output
No response
Platform
macOS