Selaa lähdekoodia

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

Bruce Marriner 9 vuotta sitten
vanhempi
commit
b329c935ac
2 muutettua tiedostoa jossa 21 lisäystä ja 0 poistoa
  1. 3 0
      structs.go
  2. 18 0
      wsapi.go

+ 3 - 0
structs.go

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

+ 18 - 0
wsapi.go

@@ -102,6 +102,17 @@ func (s *Session) Listen() (err 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 {
 		messageType, message, err := s.wsConn.ReadMessage()
 		if err != nil {
@@ -110,6 +121,13 @@ func (s *Session) Listen() (err error) {
 			break
 		}
 		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