clock icon indicating copy to clipboard operation
clock copied to clipboard

Go race with Mock

Open stevedalton opened this issue 2 years ago • 0 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.

stevedalton avatar Mar 03 '22 02:03 stevedalton