[release/1.4.4] 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.

(cherry picked from commit 7c1f74713e)
This commit is contained in:
Jeffrey Wilcke 2016-05-12 17:57:45 +02:00
parent efcfa2209b
commit 7e5c49cafa
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()