From b18b68d8ff9ba4c75f6c172192e7d0028865b7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20L=C3=B6ffel?= Date: Wed, 13 Feb 2019 21:34:50 +0100 Subject: [PATCH] fixed data race --- keepalive.go | 25 +++++++++++++++++++++++++ recws.go | 22 ++++++++++++++-------- 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 keepalive.go diff --git a/keepalive.go b/keepalive.go new file mode 100644 index 0000000..bb14889 --- /dev/null +++ b/keepalive.go @@ -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 +} diff --git a/recws.go b/recws.go index d983bdd..c0da768 100644 --- a/recws.go +++ b/recws.go @@ -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 }