Hi All,
I am stumped by this one, so I am hoping that someone on the list can
spot the bug in this piece of code.
The code is here:
https://play.golang.org/p/c3356cVtWa
The code occasionally (roughly 1 in 10 to 1 in 5 on my hardware) fails
with the data race shown below.
The code uses a fairly high frequency timer (order of tens of
milliseconds) as a data pump to push runes into a channel. That channel
is then read and displayed to the terminal. This code that the example
is derived from is a simulation of data being written to/read from a
i2c data bus. Hence the high data rate.
My understanding is that when a key is pressed that will terminate the
program. This closes the quit channel, which causes the deferred
closeChans() to be called. That in turn closes the done and the bus
channels in that order. Closing the done channel causes the select in
simBus() to complete in the <-done case. This causes the bus channel to
drain. The next call to writeToBus, which is triggered by the timer
going off - should then fail. The cancelled() function should return
true at this point so no attempt should be made to write to the bus
channel.
As I understand the data race below, this logic is flawed. Attempts are
being made to write to the bus channel after it has been closed.
So far I can't work out why, so I'm hoping someone else can.
Many thanks
Owen
Go version 1.8.1 on Linux/AMD64
==
WARNING: DATA RACE
Write at 0x00c420074060 by main goroutine:
runtime.closechan()
/home/owen/golang/go/src/runtime/chan.go:320 +0x0
main.closeChans()
/home/owen/go/src/github.com/owenwaller/tcellchanpanic/tcellchanp
anic.go:24 +0x6a
runtime.call32()
/home/owen/golang/go/src/runtime/asm_amd64.s:514 +0x47
Previous read at 0x00c420074060 by goroutine 7:
runtime.chansend()
/home/owen/golang/go/src/runtime/chan.go:128 +0x0
main.writeToBus()
/home/owen/go/src/github.com/owenwaller/tcellchanpanic/tcellchanp
anic.go:49 +0x88
main.dataPump()
/home/owen/go/src/github.com/owenwaller/tcellchanpanic/tcellchanp
anic.go:39 +0x11f
Goroutine 7 (running) created at:
main.main()
/home/owen/go/src/github.com/owenwaller/tcellchanpanic/tcellchanp
anic.go:87 +0x16e
==
panic: end of program - only one go routine
goroutine 1 [running]:
main.main()
/home/owen/go/src/github.com/owenwaller/tcellchanpanic/tcellcha
npanic.go:91 +0x21b
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.