mirror of
https://github.com/strukturag/nextcloud-spreed-signaling
synced 2024-06-08 08:52:27 +02:00
Stop using WaitGroup to detect finished message processing.
This causes flaky races if "Wait" and "Add" are being used from different goroutines.
This commit is contained in:
parent
2582e4ffb4
commit
8de8b39a5c
17
client.go
17
client.go
|
@ -106,7 +106,7 @@ type Client struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
closeChan chan bool
|
closeChan chan bool
|
||||||
messagesDone sync.WaitGroup
|
messagesDone chan bool
|
||||||
messageChan chan *bytes.Buffer
|
messageChan chan *bytes.Buffer
|
||||||
messageProcessing uint32
|
messageProcessing uint32
|
||||||
|
|
||||||
|
@ -125,14 +125,16 @@ func NewClient(conn *websocket.Conn, remoteAddress string, agent string) (*Clien
|
||||||
if agent == "" {
|
if agent == "" {
|
||||||
agent = "unknown user agent"
|
agent = "unknown user agent"
|
||||||
}
|
}
|
||||||
|
|
||||||
client := &Client{
|
client := &Client{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
addr: remoteAddress,
|
addr: remoteAddress,
|
||||||
agent: agent,
|
agent: agent,
|
||||||
logRTT: true,
|
logRTT: true,
|
||||||
|
|
||||||
closeChan: make(chan bool, 1),
|
closeChan: make(chan bool, 1),
|
||||||
messageChan: make(chan *bytes.Buffer, 16),
|
messageChan: make(chan *bytes.Buffer, 16),
|
||||||
|
messagesDone: make(chan bool, 1),
|
||||||
|
|
||||||
OnLookupCountry: func(client *Client) string { return unknownCountry },
|
OnLookupCountry: func(client *Client) string { return unknownCountry },
|
||||||
OnClosed: func(client *Client) {},
|
OnClosed: func(client *Client) {},
|
||||||
|
@ -207,7 +209,7 @@ func (c *Client) Close() {
|
||||||
|
|
||||||
func (c *Client) doClose() {
|
func (c *Client) doClose() {
|
||||||
c.closeChan <- true
|
c.closeChan <- true
|
||||||
c.messagesDone.Wait()
|
<-c.messagesDone
|
||||||
|
|
||||||
c.OnClosed(c)
|
c.OnClosed(c)
|
||||||
c.SetSession(nil)
|
c.SetSession(nil)
|
||||||
|
@ -334,25 +336,24 @@ func (c *Client) ReadPump() {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
c.messagesDone.Add(1)
|
|
||||||
c.messageChan <- decodeBuffer
|
c.messageChan <- decodeBuffer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) processMessages() {
|
func (c *Client) processMessages() {
|
||||||
|
atomic.StoreUint32(&c.messageProcessing, 1)
|
||||||
for {
|
for {
|
||||||
buffer := <-c.messageChan
|
buffer := <-c.messageChan
|
||||||
if buffer == nil {
|
if buffer == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic.StoreUint32(&c.messageProcessing, 1)
|
|
||||||
c.OnMessageReceived(c, buffer.Bytes())
|
c.OnMessageReceived(c, buffer.Bytes())
|
||||||
atomic.StoreUint32(&c.messageProcessing, 0)
|
|
||||||
c.messagesDone.Done()
|
|
||||||
bufferPool.Put(buffer)
|
bufferPool.Put(buffer)
|
||||||
}
|
}
|
||||||
|
atomic.StoreUint32(&c.messageProcessing, 0)
|
||||||
|
|
||||||
|
c.messagesDone <- true
|
||||||
if atomic.LoadUint32(&c.closed) == 2 {
|
if atomic.LoadUint32(&c.closed) == 2 {
|
||||||
c.doClose()
|
c.doClose()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue