cogentcore / core

A free and open source framework for building powerful, fast, and elegant 2D and 3D apps that run on macOS, Windows, Linux, iOS, Android, and the Web with a single pure Go codebase, allowing you to Code Once, Run Everywhere.
http://cogentcore.org/core
BSD 3-Clause "New" or "Revised" License
1.31k stars 71 forks source link

race in Sprites #987

Open rcoreilly opened 1 week ago

rcoreilly commented 1 week ago

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