Added check to prevent data websocket Listen func from running more than one instance.

This commit is contained in:
Bruce Marriner 2016-01-04 13:06:09 -06:00
parent 666cbeb6a6
commit b329c935ac
2 changed files with 21 additions and 0 deletions

View file

@ -95,6 +95,9 @@ type Session struct {
heartbeatLock sync.Mutex heartbeatLock sync.Mutex
heartbeatChan chan struct{} heartbeatChan chan struct{}
listenLock sync.Mutex
listenChan chan struct{}
} }
// A Message stores all data related to a specific Discord message. // A Message stores all data related to a specific Discord message.

View file

@ -102,6 +102,17 @@ func (s *Session) Listen() (err error) {
return // TODO need to return an error. return // TODO need to return an error.
} }
// Make sure Listen is not already running
s.listenLock.Lock()
if s.listenChan != nil {
s.listenLock.Unlock()
return
}
s.listenChan = make(chan struct{})
s.listenLock.Unlock()
defer close(s.heartbeatChan)
for { for {
messageType, message, err := s.wsConn.ReadMessage() messageType, message, err := s.wsConn.ReadMessage()
if err != nil { if err != nil {
@ -110,6 +121,13 @@ func (s *Session) Listen() (err error) {
break break
} }
go s.event(messageType, message) go s.event(messageType, message)
// If our chan gets closed, exit out of this loop.
// TODO: Can we make this smarter, using select
// and some other trickery? http://www.goinggo.net/2013/10/my-channel-select-bug.html
if s.listenChan == nil {
return nil
}
} }
return return