Skip to content

Taskin has a race condition #16

@skatkov

Description

@skatkov

Steps

  • Run go test -race ./...

Result

There appears to be a race condition

==================
WARNING: DATA RACE
Write at 0x00c0001a3730 by goroutine 10:
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:105 +0x5a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous read at 0x00c0001a3730 by goroutine 9:
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:80 +0x1fb
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001a3508 by goroutine 10:
  github.com/fumeapp/taskin.TestDisableUI.func1()
      /home/sk/Code/taskin/config_test.go:67 +0x28
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:109 +0xab
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous read at 0x00c0001a3508 by goroutine 9:
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:80 +0x1fb
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x0000008db7b0 by goroutine 10:
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:127 +0x37b
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x0000008db7b0 by goroutine 9:
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x379
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001ae6a0 by goroutine 10:
  github.com/charmbracelet/bubbletea.(*Program).Send()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3bb
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:128 +0x38a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x00c0001ae6a0 by goroutine 9:
  github.com/charmbracelet/bubbletea.NewProgram()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:181 +0x69
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x365
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001d22e8 by goroutine 10:
  sync/atomic.LoadInt64()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:208 +0xb
  sync/atomic.LoadPointer()
      <autogenerated>:1 +0x10
  context.(*cancelCtx).Done()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:449 +0x4c
  github.com/charmbracelet/bubbletea.(*Program).Send()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:128 +0x38a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x00c0001d22e8 by goroutine 9:
  context.withCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
  context.WithCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
  github.com/charmbracelet/bubbletea.NewProgram()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x365
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001d22e0 by goroutine 10:
  sync/atomic.CompareAndSwapInt32()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:361 +0xb
  sync/atomic.CompareAndSwapInt32()
      <autogenerated>:1 +0x18
  sync.(*Mutex).Lock()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/sync/mutex.go:46 +0x28
  context.(*cancelCtx).Done()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:453 +0xa5
  github.com/charmbracelet/bubbletea.(*Program).Send()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:128 +0x38a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x00c0001d22e0 by goroutine 9:
  context.withCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
  context.WithCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
  github.com/charmbracelet/bubbletea.NewProgram()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x365
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Write at 0x00c0001d22f0 by goroutine 10:
  sync/atomic.StoreInt64()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/race_amd64.s:237 +0xb
  sync/atomic.StorePointer()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/runtime/atomic_pointer.go:92 +0x44
  context.(*cancelCtx).Done()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:458 +0x124
  github.com/charmbracelet/bubbletea.(*Program).Send()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:605 +0x3ce
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:128 +0x38a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x00c0001d22f0 by goroutine 9:
  context.withCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:277 +0x53
  context.WithCancel()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/context/context.go:241 +0x26
  github.com/charmbracelet/bubbletea.NewProgram()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:197 +0x1f7
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x365
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00c0001ae6b8 by goroutine 10:
  github.com/charmbracelet/bubbletea.(*Program).Send()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:606 +0x3e4
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:128 +0x38a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Previous write at 0x00c0001ae6b8 by goroutine 9:
  github.com/charmbracelet/bubbletea.NewProgram()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:181 +0x69
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x365
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:86 +0x2de
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 10 (running) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestDisableUI()
      /home/sk/Code/taskin/config_test.go:77 +0x18d
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164
==================
✔ Test task completed
--- FAIL: TestDisableUI (0.00s)
    testing.go:1712: race detected during execution of test
==================
WARNING: DATA RACE
Write at 0x0000008db7b0 by goroutine 25:
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:81 +0x379
  github.com/fumeapp/taskin.TestRunnersRun()
      /home/sk/Code/taskin/taskin_test.go:41 +0x1c4
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Previous read at 0x0000008db7b0 by goroutine 26:
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:127 +0x37b
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Goroutine 25 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164

Goroutine 26 (finished) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestRunnersRun()
      /home/sk/Code/taskin/taskin_test.go:39 +0x19a
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
==================
==================
WARNING: DATA RACE
Read at 0x00c0002f25b0 by goroutine 25:
  github.com/fumeapp/taskin.(*Model).View()
      /home/sk/Code/taskin/mvc.go:102 +0xae
  github.com/charmbracelet/bubbletea.(*Program).Run()
      /home/sk/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.26.2/tea.go:531 +0xbfd
  github.com/fumeapp/taskin.(*Runners).Run()
      /home/sk/Code/taskin/taskin.go:82 +0x3c6
  github.com/fumeapp/taskin.TestRunnersRun()
      /home/sk/Code/taskin/taskin_test.go:41 +0x1c4
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38

Previous write at 0x00c0002f25b0 by goroutine 26:
  github.com/fumeapp/taskin.New.func1()
      /home/sk/Code/taskin/taskin.go:105 +0x5a
  github.com/fumeapp/taskin.New.func2()
      /home/sk/Code/taskin/taskin.go:142 +0x196

Goroutine 25 (running) created at:
  testing.(*T).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0xb12
  testing.runTests.func1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2585 +0x85
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.runTests()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2583 +0x9e9
  testing.(*M).Run()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2443 +0xf4b
  main.main()
      _testmain.go:64 +0x164

Goroutine 26 (finished) created at:
  github.com/fumeapp/taskin.New()
      /home/sk/Code/taskin/taskin.go:133 +0x76a
  github.com/fumeapp/taskin.TestRunnersRun()
      /home/sk/Code/taskin/taskin_test.go:39 +0x19a
  testing.tRunner()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2036 +0x21c
  testing.(*T).Run.gowrap1()
      /home/sk/.local/share/mise/installs/go/1.26.1/src/testing/testing.go:2101 +0x38
==================
✔ Test Task
--- FAIL: TestRunnersRun (0.00s)
    testing.go:1712: race detected during execution of test

First race

taskin.New starts a goroutine immediately:

  • taskin.go:133-147 starts task execution in the background.
  • That goroutine mutates shared runner/task state:
    • runner.State = Running at taskin.go:105
    • runner.Task.Title = ... at taskin.go:111
    • runner.State = Failed/Completed at taskin.go:112, taskin.go:126
    • user task callbacks can call Task.Progress, which mutates Task.ShowProgress and Task.Bar at taskin.go:45-56

At the same time, Run passes the same runner slice into Bubble Tea:

  • taskin.go:73: m := &Model{Runners: *r, ...}
    Bubble Tea then reads that same state while rendering/updating:
  • mvc.go:100-120: View reads runners/tasks.
  • mvc.go:42-81: Update reads runner state and updates spinners.
    So one goroutine writes Runner / Task fields while another goroutine reads them. There is no mutex, channel handoff, or other happens-before relationship.

Second Race

There is also a race around the package-global program:

  • taskin.go:16: var program *tea.Program
  • taskin.go:81: Run assigns it.
  • taskin.go:127-128 and taskin.go:143-144: the task goroutine reads it and calls program.Send.
    Because New starts the goroutine before Run initializes program, the goroutine can read program while another goroutine is assigning it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions