Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] data race at each SetViewOnTop() #127

Open
nomionz opened this issue Apr 24, 2023 · 1 comment
Open

[BUG] data race at each SetViewOnTop() #127

nomionz opened this issue Apr 24, 2023 · 1 comment
Labels
bug Something isn't working

Comments

@nomionz
Copy link

nomionz commented Apr 24, 2023

Describe the bug
Every time program calls the SetViewOnTop() it will produce the data race.

To Reproduce
Steps to reproduce the behavior:

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/awesome-gocui/gocui"
)

func main() {
	g, err := gocui.NewGui(gocui.OutputNormal, false)
	if err != nil {
		log.Panicln(err)
	}
	defer g.Close()

	g.SetManagerFunc(layout)

	if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
		log.Panicln(err)
	}

	if err := g.SetKeybinding("someview", gocui.KeyCtrlA, gocui.ModNone, onTop); err != nil {
		log.Panicln(err)
	}

	if err := g.SetKeybinding("someview2", gocui.KeyCtrlA, gocui.ModNone, onTop); err != nil {
		log.Panicln(err)
	}

	if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
		log.Panicln(err)
	}
}

func onTop(g *gocui.Gui, v *gocui.View) error {
	switch v.Name() {
	case "someview":
		g.SetViewOnTop("someview")
		g.SetCurrentView("someview2")
		g.SetViewOnBottom("someview2")
	case "someview2":
		g.SetViewOnTop("someview2")
		g.SetCurrentView("someview")
		g.SetViewOnBottom("someview")
	}
	return nil
}

func layout(g *gocui.Gui) error {
	maxX, maxY := g.Size()
	if v, err := g.SetView("someview", 0, 0, maxX, maxY-4, 0); err != nil {
		if err != gocui.ErrUnknownView {
			return err
		}
		v.Title = "someview"
		v.Editable = true
		g.SetCurrentView("someview")
		go dummy(g, v)
	}
	if v, err := g.SetView("someview2", maxX/2, 0, maxX-1, maxY-4, 0); err != nil {
		if err != gocui.ErrUnknownView {
			return err
		}
		v.Title = "someview2"
		v.Editable = true
		go dummy(g, v)

	}
	return nil
}

func dummy(g *gocui.Gui, v *gocui.View) {
	for {
		g.Update(func(g *gocui.Gui) error {
			for i := 0; i < 100; i++ {
				fmt.Fprintln(v, i)
			}
			return nil
		})
		time.Sleep(time.Second)
	}

}

func quit(g *gocui.Gui, v *gocui.View) error {
	return gocui.ErrQuit
}

Expected behavior
No data race, because in original gocui there is no data race

Environment (please complete the following information):

  • OS: pop-os 22.04

Additional context
data race stack trace

==================
WARNING: DATA RACE
Write at 0x00c000308040 by main goroutine:
  runtime.slicecopy()
      /usr/local/go/src/runtime/slice.go:310 +0x0
  github.com/awesome-gocui/gocui.(*Gui).SetViewOnTop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:244 +0xa93
  main.onTop()
      /home/nomionz/dev/test/main.go:40 +0xba2
  github.com/awesome-gocui/gocui.(*Gui).execKeybinding()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:947 +0x106
  github.com/awesome-gocui/gocui.(*Gui).execKeybindings()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:926 +0x37c
  github.com/awesome-gocui/gocui.(*Gui).onKey()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:882 +0x15d
  github.com/awesome-gocui/gocui.(*Gui).handleEvent()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:554 +0x5b
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:504 +0x3c4
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386

Previous read at 0x00c000308040 by goroutine 13:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick.func1()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:8 +0x139

Goroutine 13 (running) created at:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:6 +0x8e
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:477 +0x4a
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386
==================
==================
WARNING: DATA RACE
Write at 0x00c000308048 by main goroutine:
  github.com/awesome-gocui/gocui.(*Gui).SetViewOnTop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:245 +0xb04
  main.onTop()
      /home/nomionz/dev/test/main.go:40 +0xba2
  github.com/awesome-gocui/gocui.(*Gui).execKeybinding()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:947 +0x106
  github.com/awesome-gocui/gocui.(*Gui).execKeybindings()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:926 +0x37c
  github.com/awesome-gocui/gocui.(*Gui).onKey()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:882 +0x15d
  github.com/awesome-gocui/gocui.(*Gui).handleEvent()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:554 +0x5b
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:504 +0x3c4
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386

Previous read at 0x00c000308048 by goroutine 13:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick.func1()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:8 +0x139

Goroutine 13 (running) created at:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:6 +0x8e
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:477 +0x4a
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386
==================
==================
WARNING: DATA RACE
Write at 0x00c0002b4030 by main goroutine:
  runtime.slicecopy()
      /usr/local/go/src/runtime/slice.go:310 +0x0
  github.com/awesome-gocui/gocui.(*Gui).SetViewOnTop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:244 +0x30c
  main.onTop()
      /home/nomionz/dev/test/main.go:44 +0x41b
  github.com/awesome-gocui/gocui.(*Gui).execKeybinding()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:947 +0x106
  github.com/awesome-gocui/gocui.(*Gui).execKeybindings()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:926 +0x37c
  github.com/awesome-gocui/gocui.(*Gui).onKey()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:882 +0x15d
  github.com/awesome-gocui/gocui.(*Gui).handleEvent()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:554 +0x5b
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:504 +0x3c4
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386

Previous read at 0x00c0002b4030 by goroutine 13:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick.func1()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:8 +0x139

Goroutine 13 (running) created at:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:6 +0x8e
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:477 +0x4a
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386
==================
==================
WARNING: DATA RACE
Write at 0x00c0002b4038 by main goroutine:
  github.com/awesome-gocui/gocui.(*Gui).SetViewOnTop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:245 +0x37e
  main.onTop()
      /home/nomionz/dev/test/main.go:44 +0x41b
  github.com/awesome-gocui/gocui.(*Gui).execKeybinding()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:947 +0x106
  github.com/awesome-gocui/gocui.(*Gui).execKeybindings()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:926 +0x37c
  github.com/awesome-gocui/gocui.(*Gui).onKey()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:882 +0x15d
  github.com/awesome-gocui/gocui.(*Gui).handleEvent()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:554 +0x5b
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:504 +0x3c4
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386

Previous read at 0x00c0002b4038 by goroutine 13:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick.func1()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:8 +0x139

Goroutine 13 (running) created at:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:6 +0x8e
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:477 +0x4a
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386
==================
==================
WARNING: DATA RACE
Write at 0x00c0002ac010 by main goroutine:
  github.com/awesome-gocui/gocui.(*Gui).SetViewOnTop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:245 +0x3c4
  main.onTop()
      /home/nomionz/dev/test/main.go:44 +0x41b
  github.com/awesome-gocui/gocui.(*Gui).execKeybinding()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:947 +0x106
  github.com/awesome-gocui/gocui.(*Gui).execKeybindings()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:926 +0x37c
  github.com/awesome-gocui/gocui.(*Gui).onKey()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:882 +0x15d
  github.com/awesome-gocui/gocui.(*Gui).handleEvent()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:554 +0x5b
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:504 +0x3c4
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386

Previous read at 0x00c0002ac010 by goroutine 13:
  github.com/awesome-gocui/gocui.(*Gui).Views()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:266 +0x9b
  github.com/awesome-gocui/gocui.(*Gui).loaderTick.func1()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:8 +0xb5

Goroutine 13 (running) created at:
  github.com/awesome-gocui/gocui.(*Gui).loaderTick()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/loader.go:6 +0x8e
  github.com/awesome-gocui/gocui.(*Gui).MainLoop()
      /home/nomionz/go/pkg/mod/github.com/awesome-gocui/gocui@v1.1.0/gui.go:477 +0x4a
  main.main()
      /home/nomionz/dev/test/main.go:32 +0x386
==================
@nomionz nomionz added the bug Something isn't working label Apr 24, 2023
@nomionz
Copy link
Author

nomionz commented Apr 24, 2023

For those wondering the workaround is to comment out the loaderTick() in the MainLoop() function.

gocui/gui.go

Lines 476 to 477 in 384f06f

func (g *Gui) MainLoop() error {
g.loaderTick()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant