core
core copied to clipboard
race in Sprites
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:
go build -race -gcflags=all=-d=checkptr=0
How to reproduce
do it.
Example code
==================
==================
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
Relevant output
No response
Platform
macOS