Fix concurrent panic

This commit is contained in:
lesismal
2021-05-20 03:01:17 +08:00
parent 7bd65910e5
commit e21886f3a7
2 changed files with 27 additions and 24 deletions
+1
View File
@@ -178,6 +178,7 @@ func (m *Melody) HandleRequestWithKeys(w http.ResponseWriter, r *http.Request, k
Keys: keys, Keys: keys,
conn: conn, conn: conn,
output: make(chan *envelope, m.Config.MessageBufferSize), output: make(chan *envelope, m.Config.MessageBufferSize),
outputDone: make(chan struct{}),
melody: m, melody: m,
open: true, open: true,
rwmutex: &sync.RWMutex{}, rwmutex: &sync.RWMutex{},
+10 -8
View File
@@ -15,6 +15,7 @@ type Session struct {
Keys map[string]interface{} Keys map[string]interface{}
conn *websocket.Conn conn *websocket.Conn
output chan *envelope output chan *envelope
outputDone chan struct{}
melody *Melody melody *Melody
open bool open bool
rwmutex *sync.RWMutex rwmutex *sync.RWMutex
@@ -56,12 +57,13 @@ func (s *Session) closed() bool {
} }
func (s *Session) close() { func (s *Session) close() {
if !s.closed() {
s.rwmutex.Lock() s.rwmutex.Lock()
open := s.open
s.open = false s.open = false
s.conn.Close()
close(s.output)
s.rwmutex.Unlock() s.rwmutex.Unlock()
if open {
s.conn.Close()
close(s.outputDone)
} }
} }
@@ -76,11 +78,7 @@ func (s *Session) writePump() {
loop: loop:
for { for {
select { select {
case msg, ok := <-s.output: case msg := <-s.output:
if !ok {
break loop
}
err := s.writeRaw(msg) err := s.writeRaw(msg)
if err != nil { if err != nil {
@@ -101,6 +99,10 @@ loop:
} }
case <-ticker.C: case <-ticker.C:
s.ping() s.ping()
case _, ok := <-s.outputDone:
if !ok {
break loop
}
} }
} }
} }