From a570815616a18608b640b17e447088f842f6745d Mon Sep 17 00:00:00 2001 From: Roman Vasilyev Date: Thu, 31 Jan 2019 23:10:02 -0800 Subject: [PATCH 1/3] critical for writing from mutiple threads --- recws.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/recws.go b/recws.go index 4fee538..5f579ea 100644 --- a/recws.go +++ b/recws.go @@ -98,7 +98,9 @@ func (rc *RecConn) ReadMessage() (messageType int, message []byte, err error) { func (rc *RecConn) WriteMessage(messageType int, data []byte) error { err := ErrNotConnected if rc.IsConnected() { + rc.mu.Lock() err = rc.Conn.WriteMessage(messageType, data) + rc.mu.Unlock() if err != nil { rc.closeAndReconnect() } @@ -116,7 +118,9 @@ func (rc *RecConn) WriteMessage(messageType int, data []byte) error { func (rc *RecConn) WriteJSON(v interface{}) error { err := ErrNotConnected if rc.IsConnected() { + rc.mu.Lock() err = rc.Conn.WriteJSON(v) + rc.mu.Unlock() if err != nil { rc.closeAndReconnect() } @@ -210,7 +214,6 @@ func (rc *RecConn) setDefaultHandshakeTimeout() { } } - func (rc *RecConn) setDefaultDialer(handshakeTimeout time.Duration) { rc.mu.Lock() defer rc.mu.Unlock() From d61b9bc78b17b875b29fa26218c164a41e9a2acc Mon Sep 17 00:00:00 2001 From: Roman Vasilyev Date: Fri, 1 Feb 2019 23:15:41 -0800 Subject: [PATCH 2/3] deadlock fix --- recws.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recws.go b/recws.go index 5f579ea..e1006a0 100644 --- a/recws.go +++ b/recws.go @@ -66,10 +66,10 @@ func (rc *RecConn) setIsConnected(state bool) { // Close closes the underlying network connection without // sending or waiting for a close frame. func (rc *RecConn) Close() { - rc.mu.RLock() - defer rc.mu.RUnlock() if rc.Conn != nil { + rc.mu.RLock() rc.Conn.Close() + rc.mu.RUnlock() } rc.setIsConnected(false) From e4150e8085153d32dea02ea865f7054f704e8dfb Mon Sep 17 00:00:00 2001 From: Roman Vasilyev Date: Mon, 11 Feb 2019 12:12:24 -0800 Subject: [PATCH 3/3] recommended code --- recws.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/recws.go b/recws.go index e1006a0..b003118 100644 --- a/recws.go +++ b/recws.go @@ -63,13 +63,20 @@ func (rc *RecConn) setIsConnected(state bool) { rc.isConnected = state } +func (rc *RecConn) getConn() *websocket.Conn { + rc.mu.RLock() + defer rc.mu.RUnlock() + + return rc.Conn +} + // Close closes the underlying network connection without // sending or waiting for a close frame. func (rc *RecConn) Close() { - if rc.Conn != nil { - rc.mu.RLock() + if rc.getConn() != nil { + rc.mu.Lock() rc.Conn.Close() - rc.mu.RUnlock() + rc.mu.Unlock() } rc.setIsConnected(false)