Skip to content
This repository was archived by the owner on May 18, 2023. It is now read-only.
This repository was archived by the owner on May 18, 2023. It is now read-only.

Go race with Mock #44

@stevedalton

Description

@stevedalton

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.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions