Added check to prevent data websocket Listen func from running more than one instance.
This commit is contained in:
parent
666cbeb6a6
commit
b329c935ac
2 changed files with 21 additions and 0 deletions
|
@ -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.
|
||||||
|
|
18
wsapi.go
18
wsapi.go
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue