benbjohnson / clock

Clock is a small library for mocking time in Go.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Go race with Mock

stevedalton opened this issue · comments

I believe the following demonstrates the issue:

c := clock.NewMock()
go c.Ticker(time.Second).Stop()
c.Add(time.Second)

Unfortunately, it's hard to get Go's race detector to catch this (I only ran it across it in a more complicated case by accident).

The detailed problem is as follows:

  • The internal method removeClockTimer sorts the timers while holding the mutex. The sort method calls Next(), which reads the internal next field.
  • The internal method runNextTimer calls Tick on the timer without holding the mutex, and Tick sets the internal next field of the timer.

It seems that solving this might just require removing the sort.Sort call in removeClockTimer.