Fix KeyPressed data race

go run -race cmd/darktile/main.go

WARNING: DATA RACE
Write at 0x00c00009fbc0 by goroutine 20:
	runtime.mapdelete_fast64()
	/usr/lib/go/src/runtime/map_fast64.go:272 +0x0
	github.com/liamg/darktile/internal/app/darktile/gui.(*keyState).RepeatPressed()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/key_states.go:61 +0x428
	github.com/liamg/darktile/internal/app/darktile/gui.(*GUI).handleInput()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/input.go:109 +0x224
	github.com/liamg/darktile/internal/app/darktile/gui.(*GUI).Update()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/update.go:34 +0x2e
	github.com/hajimehoshi/ebiten/v2.(*imageDumper).update()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/imagedumper_desktop.go:111 +0x85
	github.com/hajimehoshi/ebiten/v2.(*imageDumperGame).Update()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/run.go:115 +0x172
	github.com/hajimehoshi/ebiten/v2.(*uiContext).updateImpl()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/uicontext.go:194 +0x12c
	github.com/hajimehoshi/ebiten/v2.(*uiContext).update()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/uicontext.go:166 +0x88
	github.com/hajimehoshi/ebiten/v2.(*uiContext).Update()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/uicontext.go:147 +0x3b
	github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw.(*UserInterface).loop()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw/ui.go:1036 +0x401
	github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw.(*UserInterface).Run.func1()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw/run_notsinglethread.go:53 +0x1b1
Previous read at 0x00c00009fbc0 by goroutine 19:
	github.com/liamg/darktile/internal/app/darktile/gui.(*keyState).AnythingPressed()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/key_states.go:33 +0xbc
	github.com/liamg/darktile/internal/app/darktile/gui.(*GUI).watchForUpdate()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/gui.go:105 +0x77
	github.com/liamg/darktile/internal/app/darktile/gui.(*GUI).Run·dwrap·2()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/gui.go:97 +0x39
Goroutine 20 (running) created at:
	github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw.(*UserInterface).Run()
	/home/ernestrc/src/darktile/vendor/github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw/run_notsinglethread.go:37 +0x2c4
	github.com/hajimehoshi/ebiten/v2.RunGame()
Goroutine 19 (running) created at:
	github.com/liamg/darktile/internal/app/darktile/gui.(*GUI).Run()
	/home/ernestrc/src/darktile/internal/app/darktile/gui/gui.go:97 +0x2ca
	github.com/liamg/darktile/internal/app/darktile/cmd.glob..func2()
	/home/ernestrc/src/darktile/internal/app/darktile/cmd/root.go:130 +0x13a9
	github.com/spf13/cobra.(*Command).execute()
	/home/ernestrc/src/darktile/vendor/github.com/spf13/cobra/command.go:852 +0xa7d
	github.com/spf13/cobra.(*Command).ExecuteC()
	/home/ernestrc/src/darktile/vendor/github.com/spf13/cobra/command.go:960 +0x5da
	github.com/spf13/cobra.(*Command).Execute()
	/home/ernestrc/src/darktile/vendor/github.com/spf13/cobra/command.go:897 +0x366
	github.com/liamg/darktile/internal/app/darktile/cmd.Execute()
	/home/ernestrc/src/darktile/internal/app/darktile/cmd/root.go:153 +0x34f
	main.main()
	/home/ernestrc/src/darktile/cmd/darktile/main.go:75 +0x24
This commit is contained in:
ernestrc 2022-05-09 14:56:39 -07:00
parent 5d13a3d6f2
commit 2daf340ea4
No known key found for this signature in database
GPG Key ID: 064D4ABCFA6D9338
2 changed files with 6 additions and 4 deletions

View File

@ -102,12 +102,12 @@ func (g *GUI) Run() error {
func (g *GUI) watchForUpdate() {
for range g.updateChan {
ebiten.ScheduleFrame()
go func() {
if g.keyState.AnythingPressed() {
if g.keyState.AnythingPressed() {
go func() {
time.Sleep(time.Millisecond * 10)
ebiten.ScheduleFrame()
}
}()
}()
}
}
}

View File

@ -30,6 +30,8 @@ type press struct {
}
func (k *keyState) AnythingPressed() bool {
k.mu.Lock()
defer k.mu.Unlock()
return len(k.keys) > 0
}