2
0

fixed data race

This commit is contained in:
Lucas Löffel
2019-02-13 21:34:50 +01:00
parent 40a86b719c
commit b18b68d8ff
2 changed files with 39 additions and 8 deletions
+25
View File
@@ -0,0 +1,25 @@
package recws
import (
"sync"
"time"
)
type keepAliveResponse struct {
lastResponse time.Time
sync.RWMutex
}
func (k *keepAliveResponse) setLastResponse() {
k.Lock()
defer k.Unlock()
k.lastResponse = time.Now()
}
func (k *keepAliveResponse) getLastResponse() time.Time {
k.RLock()
defer k.RUnlock()
return k.lastResponse
}
+14 -8
View File
@@ -308,27 +308,33 @@ func (rc *RecConn) getKeepAliveTimeout() time.Duration {
return rc.KeepAliveTimeout
}
func (rc *RecConn) writeControlPingMessage() error {
rc.mu.Lock()
defer rc.mu.Unlock()
return rc.Conn.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(10*time.Second))
}
func (rc *RecConn) keepAlive() {
var (
lastResponse = time.Now()
ticker = time.NewTicker(rc.getKeepAliveTimeout())
keepAliveResponse = new(keepAliveResponse)
ticker = time.NewTicker(rc.getKeepAliveTimeout())
)
rc.mu.Lock()
rc.Conn.SetPongHandler(func(msg string) error {
lastResponse = time.Now()
keepAliveResponse.setLastResponse()
return nil
})
rc.mu.Unlock()
go func() {
defer ticker.Stop()
for {
if err := rc.Conn.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(10*time.Second)); err != nil {
return
}
rc.writeControlPingMessage()
<-ticker.C
if time.Now().Sub(lastResponse) > rc.getKeepAliveTimeout() {
if time.Now().Sub(keepAliveResponse.getLastResponse()) > rc.getKeepAliveTimeout() {
rc.closeAndReconnect()
return
}