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.
This commit is contained in:
Jeffrey Wilcke 2016-05-12 17:57:45 +02:00
parent a5ff487889
commit 7c1f74713e
2 changed files with 11 additions and 0 deletions

View File

@ -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 {

View File

@ -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()