Commit 260597d5 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Ensure actions happen in order.

parent 9ba10372
...@@ -62,7 +62,7 @@ type webClient struct { ...@@ -62,7 +62,7 @@ type webClient struct {
done chan struct{} done chan struct{}
writeCh chan interface{} writeCh chan interface{}
writerDone chan struct{} writerDone chan struct{}
actionCh chan interface{} actionCh chan struct{}
mu sync.Mutex mu sync.Mutex
down map[string]*rtpDownConnection down map[string]*rtpDownConnection
...@@ -739,7 +739,7 @@ func StartClient(conn *websocket.Conn) (err error) { ...@@ -739,7 +739,7 @@ func StartClient(conn *websocket.Conn) (err error) {
c := &webClient{ c := &webClient{
id: m.Id, id: m.Id,
actionCh: make(chan interface{}, 10), actionCh: make(chan struct{}, 1),
done: make(chan struct{}), done: make(chan struct{}),
} }
...@@ -810,13 +810,6 @@ func clientLoop(c *webClient, ws *websocket.Conn) error { ...@@ -810,13 +810,6 @@ func clientLoop(c *webClient, ws *websocket.Conn) error {
} }
for { for {
c.mu.Lock()
actions := c.actions
c.actions = nil
c.mu.Unlock()
for _, a := range actions {
handleAction(c, a)
}
select { select {
case m, ok := <-read: case m, ok := <-read:
if !ok { if !ok {
...@@ -832,10 +825,13 @@ func clientLoop(c *webClient, ws *websocket.Conn) error { ...@@ -832,10 +825,13 @@ func clientLoop(c *webClient, ws *websocket.Conn) error {
case error: case error:
return m return m
} }
case a := <-c.actionCh: case <-c.actionCh:
err := handleAction(c, a) c.mu.Lock()
if err != nil { actions := c.actions
return err c.actions = nil
c.mu.Unlock()
for _, a := range actions {
handleAction(c, a)
} }
case <-ticker.C: case <-ticker.C:
if time.Since(readTime) > 75*time.Second { if time.Since(readTime) > 75*time.Second {
...@@ -1551,16 +1547,17 @@ var ErrClientDead = errors.New("client is dead") ...@@ -1551,16 +1547,17 @@ var ErrClientDead = errors.New("client is dead")
func (c *webClient) action(a interface{}) error { func (c *webClient) action(a interface{}) error {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if len(c.actions) == 0 { empty := len(c.actions) == 0
c.actions = append(c.actions, a)
if empty {
select { select {
case c.actionCh <- a: case c.actionCh <- struct{}{}:
return nil return nil
case <-c.done: case <-c.done:
return ErrClientDead return ErrClientDead
default: default:
} }
} }
c.actions = append(c.actions, a)
return nil return nil
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment