event: panic for duplicate type
This commit is contained in:
parent
ade980912d
commit
fa84e50ddb
@ -3,6 +3,7 @@ package event
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@ -40,6 +41,7 @@ var ErrMuxClosed = errors.New("event: mux closed")
|
|||||||
func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
|
func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
|
||||||
sub := newsub(mux)
|
sub := newsub(mux)
|
||||||
mux.mutex.Lock()
|
mux.mutex.Lock()
|
||||||
|
defer mux.mutex.Unlock()
|
||||||
if mux.stopped {
|
if mux.stopped {
|
||||||
close(sub.postC)
|
close(sub.postC)
|
||||||
} else {
|
} else {
|
||||||
@ -49,13 +51,15 @@ func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
|
|||||||
for _, t := range types {
|
for _, t := range types {
|
||||||
rtyp := reflect.TypeOf(t)
|
rtyp := reflect.TypeOf(t)
|
||||||
oldsubs := mux.subm[rtyp]
|
oldsubs := mux.subm[rtyp]
|
||||||
|
if find(oldsubs, sub) != -1 {
|
||||||
|
panic(fmt.Sprintf("event: duplicate type %s in Subscribe", rtyp))
|
||||||
|
}
|
||||||
subs := make([]*muxsub, len(oldsubs)+1)
|
subs := make([]*muxsub, len(oldsubs)+1)
|
||||||
copy(subs, oldsubs)
|
copy(subs, oldsubs)
|
||||||
subs[len(oldsubs)] = sub
|
subs[len(oldsubs)] = sub
|
||||||
mux.subm[rtyp] = subs
|
mux.subm[rtyp] = subs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mux.mutex.Unlock()
|
|
||||||
return sub
|
return sub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +60,21 @@ func TestUnsubscribeUnblockPost(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSubscribeDuplicateType(t *testing.T) {
|
||||||
|
mux := new(TypeMux)
|
||||||
|
expected := "event: duplicate type event.testEvent in Subscribe"
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
err := recover()
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Subscribe didn't panic for duplicate type")
|
||||||
|
} else if err != expected {
|
||||||
|
t.Errorf("panic mismatch: got %#v, expected %#v", err, expected)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
mux.Subscribe(testEvent(1), testEvent(2))
|
||||||
|
}
|
||||||
|
|
||||||
func TestMuxConcurrent(t *testing.T) {
|
func TestMuxConcurrent(t *testing.T) {
|
||||||
rand.Seed(time.Now().Unix())
|
rand.Seed(time.Now().Unix())
|
||||||
mux := new(TypeMux)
|
mux := new(TypeMux)
|
||||||
|
Loading…
Reference in New Issue
Block a user