2014-06-21 21:22:38 +00:00
|
|
|
package pubsub
|
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
2014-09-29 06:18:52 +00:00
|
|
|
|
|
|
|
"code.google.com/p/go.net/context"
|
2014-06-21 21:22:38 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type PubSub struct {
|
|
|
|
sync.Mutex
|
|
|
|
|
|
|
|
// In-memory list of all channels being managed by the broker.
|
|
|
|
channels map[interface{}]*Channel
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewPubSub creates a new instance of the PubSub type
|
|
|
|
// and returns a pointer.
|
|
|
|
func NewPubSub() *PubSub {
|
|
|
|
return &PubSub{
|
|
|
|
channels: make(map[interface{}]*Channel),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Lookup performs a thread safe operation to return a pointer
|
|
|
|
// to an existing Channel object with the given key. If the
|
|
|
|
// Channel does not exist a nil value is returned.
|
|
|
|
func (b *PubSub) Lookup(key interface{}) *Channel {
|
|
|
|
b.Lock()
|
|
|
|
defer b.Unlock()
|
|
|
|
|
|
|
|
// find the channel in the existing list
|
|
|
|
return b.channels[key]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register performs a thread safe operation to return a pointer
|
|
|
|
// to a Channel object for the given key. The Channel is created
|
|
|
|
// if it does not yet exist.
|
|
|
|
func (b *PubSub) Register(key interface{}) *Channel {
|
|
|
|
return b.RegisterOpts(key, DefaultOpts)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register performs a thread safe operation to return a pointer
|
|
|
|
// to a Channel object for the given key. The Channel is created
|
|
|
|
// if it does not yet exist using custom options.
|
|
|
|
func (b *PubSub) RegisterOpts(key interface{}, opts *Opts) *Channel {
|
|
|
|
b.Lock()
|
|
|
|
defer b.Unlock()
|
|
|
|
|
|
|
|
// find the channel in the existing list
|
|
|
|
c, ok := b.channels[key]
|
|
|
|
if ok {
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
|
|
|
// create the channel and register
|
|
|
|
// with the pubsub server
|
|
|
|
c = NewChannel(opts)
|
|
|
|
b.channels[key] = c
|
|
|
|
go c.start()
|
|
|
|
return c
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unregister performs a thread safe operation to delete the
|
|
|
|
// Channel with the given key.
|
|
|
|
func (b *PubSub) Unregister(key interface{}) {
|
|
|
|
b.Lock()
|
|
|
|
defer b.Unlock()
|
|
|
|
|
|
|
|
// find the channel in the existing list
|
|
|
|
c, ok := b.channels[key]
|
|
|
|
if !ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
c.Close()
|
|
|
|
delete(b.channels, key)
|
|
|
|
return
|
|
|
|
}
|
2014-09-29 06:18:52 +00:00
|
|
|
|
|
|
|
// Lookup performs a thread safe operation to return a pointer
|
|
|
|
// to an existing Channel object with the given key. If the
|
|
|
|
// Channel does not exist a nil value is returned.
|
|
|
|
func Lookup(c context.Context, key interface{}) *Channel {
|
|
|
|
return FromContext(c).Lookup(key)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register performs a thread safe operation to return a pointer
|
|
|
|
// to a Channel object for the given key. The Channel is created
|
|
|
|
// if it does not yet exist.
|
|
|
|
func Register(c context.Context, key interface{}) *Channel {
|
|
|
|
return FromContext(c).Register(key)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register performs a thread safe operation to return a pointer
|
|
|
|
// to a Channel object for the given key. The Channel is created
|
|
|
|
// if it does not yet exist using custom options.
|
|
|
|
func RegisterOpts(c context.Context, key interface{}, opts *Opts) *Channel {
|
|
|
|
return FromContext(c).RegisterOpts(key, opts)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unregister performs a thread safe operation to delete the
|
|
|
|
// Channel with the given key.
|
|
|
|
func Unregister(c context.Context, key interface{}) {
|
|
|
|
FromContext(c).Unregister(key)
|
|
|
|
}
|