Instead of this sleep I think you should poll the number of waiters and step as soon as it's non-zero. (In fact you could do that in a separate goroutine instead launching a new one here.)    A 3ms sleep is going to make this racy, I'm pretty sure.