Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
**Requirements** - [x] I have added test coverage for new or changed functionality - [x] I have followed the repository's [pull request submission guidelines](../blob/v5/CONTRIBUTING.md#submitting-pull-requests) - [ ] I have validated my changes against all supported platform versions * What does "platform" mean here? Go version? OS version? Happy to help test, just not sure what I'm testing! **Related issues** I hit data races when running tests in parallel, which effectively obscures other data races my application may have. It looks like others did too, judging by #102. Fixes #102 **Describe the solution you've provided** I've addressed 2 data races with improved locking: * `HasListeners()` had a data race due to any mutation on `b.subscribers` * `Close()` had a data race where closing a send channel triggers a panic in `Broadcast()` I also saw an easy opportunity to use more fine-grained locks with an RWMutex, although I'm happy to back that out if you would prefer. **Describe alternatives you've considered** I also considered using an atomic data type for subscribers, but I figured that change would be less of a surgical fix. It also may be more difficult to mutate the slice, since a compare-and-swap can fail and would need a loop (it's not as simple as `atomic.Add`). Another idea which may be simpler is using a channel to manage shutdown. Typically I'd use a `context.Context` here to manage cancellation. That'd also prevent `Broadcast()`ing on a full send channel from blocking `Close()`. **Additional context** Add any other context about the pull request here.
- Loading branch information