event: fixed subscribtions to stopped event mux

This fixes an issue where the following would lead to a panic due to a
channel being closed twice:

* Start mux
* Stop mux
* Sub to mux
* Unsub

This is fixed by setting the subscriptions status to closed resulting in
the Unsubscribe to ignore the request when called.
pull/2563/head
Jeffrey Wilcke 9 years ago
parent a5ff487889
commit 7c1f74713e
  1. 3
      event/event.go
  2. 8
      event/event_test.go

@ -66,6 +66,9 @@ func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
mux.mutex.Lock() mux.mutex.Lock()
defer mux.mutex.Unlock() defer mux.mutex.Unlock()
if mux.stopped { if mux.stopped {
// set the status to closed so that calling Unsubscribe after this
// call will short curuit
sub.closed = true
close(sub.postC) close(sub.postC)
} else { } else {
if mux.subm == nil { if mux.subm == nil {

@ -25,6 +25,14 @@ import (
type testEvent int type testEvent int
func TestSubCloseUnsub(t *testing.T) {
// the point of this test is **not** to panic
var mux TypeMux
mux.Stop()
sub := mux.Subscribe(int(0))
sub.Unsubscribe()
}
func TestSub(t *testing.T) { func TestSub(t *testing.T) {
mux := new(TypeMux) mux := new(TypeMux)
defer mux.Stop() defer mux.Stop()

Loading…
Cancel
Save