aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2014-10-17 00:10:09 +0800
committerFelix Lange <fjl@twurst.com>2014-10-17 00:50:48 +0800
commit690690489610352d43f8547744b6c9486ad5affa (patch)
tree2d8846b015d3e42b1daf1bd74ca40ef883bb9f5c
parent10bbf265b2e8f1906602d2604f755241b8eb49e6 (diff)
downloadgo-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar.gz
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar.bz2
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar.lz
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar.xz
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.tar.zst
go-tangerine-690690489610352d43f8547744b6c9486ad5affa.zip
event: make TypeMux zero value ready to use
-rw-r--r--event/event.go13
-rw-r--r--event/event_test.go12
2 files changed, 12 insertions, 13 deletions
diff --git a/event/event.go b/event/event.go
index 344d1e3f6..d11a0e9bd 100644
--- a/event/event.go
+++ b/event/event.go
@@ -23,6 +23,8 @@ type Subscription interface {
// A TypeMux dispatches events to registered receivers. Receivers can be
// registered to handle events of certain type. Any operation
// called after mux is stopped will return ErrMuxClosed.
+//
+// The zero value is ready to use.
type TypeMux struct {
mutex sync.RWMutex
subm map[reflect.Type][]*muxsub
@@ -32,11 +34,6 @@ type TypeMux struct {
// ErrMuxClosed is returned when Posting on a closed TypeMux.
var ErrMuxClosed = errors.New("event: mux closed")
-// NewTypeMux creates a running mux.
-func NewTypeMux() *TypeMux {
- return &TypeMux{subm: make(map[reflect.Type][]*muxsub)}
-}
-
// Subscribe creates a subscription for events of the given types. The
// subscription's channel is closed when it is unsubscribed
// or the mux is closed.
@@ -44,9 +41,11 @@ func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
sub := newsub(mux)
mux.mutex.Lock()
if mux.stopped {
- mux.mutex.Unlock()
close(sub.postC)
} else {
+ if mux.subm == nil {
+ mux.subm = make(map[reflect.Type][]*muxsub)
+ }
for _, t := range types {
rtyp := reflect.TypeOf(t)
oldsubs := mux.subm[rtyp]
@@ -55,8 +54,8 @@ func (mux *TypeMux) Subscribe(types ...interface{}) Subscription {
subs[len(oldsubs)] = sub
mux.subm[rtyp] = subs
}
- mux.mutex.Unlock()
}
+ mux.mutex.Unlock()
return sub
}
diff --git a/event/event_test.go b/event/event_test.go
index 385bd70b7..f65aaa0a2 100644
--- a/event/event_test.go
+++ b/event/event_test.go
@@ -10,7 +10,7 @@ import (
type testEvent int
func TestSub(t *testing.T) {
- mux := NewTypeMux()
+ mux := new(TypeMux)
defer mux.Stop()
sub := mux.Subscribe(testEvent(0))
@@ -28,7 +28,7 @@ func TestSub(t *testing.T) {
}
func TestMuxErrorAfterStop(t *testing.T) {
- mux := NewTypeMux()
+ mux := new(TypeMux)
mux.Stop()
sub := mux.Subscribe(testEvent(0))
@@ -41,7 +41,7 @@ func TestMuxErrorAfterStop(t *testing.T) {
}
func TestUnsubscribeUnblockPost(t *testing.T) {
- mux := NewTypeMux()
+ mux := new(TypeMux)
defer mux.Stop()
sub := mux.Subscribe(testEvent(0))
@@ -62,7 +62,7 @@ func TestUnsubscribeUnblockPost(t *testing.T) {
func TestMuxConcurrent(t *testing.T) {
rand.Seed(time.Now().Unix())
- mux := NewTypeMux()
+ mux := new(TypeMux)
defer mux.Stop()
recv := make(chan int)
@@ -111,7 +111,7 @@ func emptySubscriber(mux *TypeMux, types ...interface{}) {
}
func BenchmarkPost3(b *testing.B) {
- var mux = NewTypeMux()
+ var mux = new(TypeMux)
defer mux.Stop()
emptySubscriber(mux, testEvent(0))
emptySubscriber(mux, testEvent(0))
@@ -123,7 +123,7 @@ func BenchmarkPost3(b *testing.B) {
}
func BenchmarkPostConcurrent(b *testing.B) {
- var mux = NewTypeMux()
+ var mux = new(TypeMux)
defer mux.Stop()
emptySubscriber(mux, testEvent(0))
emptySubscriber(mux, testEvent(0))