diff --git a/relay/client/manager.go b/relay/client/manager.go index 0fb682d95..b97bc0b99 100644 --- a/relay/client/manager.go +++ b/relay/client/manager.go @@ -65,7 +65,7 @@ type Manager struct { relayClient *Client // the guard logic can overwrite the relayClient variable, this mutex protect the usage of the variable - relayClientMu sync.Mutex + relayClientMu sync.RWMutex reconnectGuard *Guard relayClients map[string]*RelayTrack @@ -124,8 +124,8 @@ func (m *Manager) Serve() error { // established via the relay server. If the peer is on a different relay server, the manager will establish a new // connection to the relay server. It returns back with a net.Conn what represent the remote peer connection. func (m *Manager) OpenConn(ctx context.Context, serverAddress, peerKey string) (net.Conn, error) { - m.relayClientMu.Lock() - defer m.relayClientMu.Unlock() + m.relayClientMu.RLock() + defer m.relayClientMu.RUnlock() if m.relayClient == nil { return nil, ErrRelayClientNotConnected @@ -155,8 +155,8 @@ func (m *Manager) OpenConn(ctx context.Context, serverAddress, peerKey string) ( // Ready returns true if the home Relay client is connected to the relay server. func (m *Manager) Ready() bool { - m.relayClientMu.Lock() - defer m.relayClientMu.Unlock() + m.relayClientMu.RLock() + defer m.relayClientMu.RUnlock() if m.relayClient == nil { return false @@ -174,8 +174,8 @@ func (m *Manager) SetOnReconnectedListener(f func()) { // AddCloseListener adds a listener to the given server instance address. The listener will be called if the connection // closed. func (m *Manager) AddCloseListener(serverAddress string, onClosedListener OnServerCloseListener) error { - m.relayClientMu.Lock() - defer m.relayClientMu.Unlock() + m.relayClientMu.RLock() + defer m.relayClientMu.RUnlock() if m.relayClient == nil { return ErrRelayClientNotConnected @@ -199,8 +199,8 @@ func (m *Manager) AddCloseListener(serverAddress string, onClosedListener OnServ // RelayInstanceAddress returns the address of the permanent relay server. It could change if the network connection is // lost. This address will be sent to the target peer to choose the common relay server for the communication. func (m *Manager) RelayInstanceAddress() (string, error) { - m.relayClientMu.Lock() - defer m.relayClientMu.Unlock() + m.relayClientMu.RLock() + defer m.relayClientMu.RUnlock() if m.relayClient == nil { return "", ErrRelayClientNotConnected @@ -300,7 +300,9 @@ func (m *Manager) onServerConnected() { func (m *Manager) onServerDisconnected(serverAddress string) { m.relayClientMu.Lock() if serverAddress == m.relayClient.connectionURL { - go m.reconnectGuard.StartReconnectTrys(m.ctx, m.relayClient) + go func(client *Client) { + m.reconnectGuard.StartReconnectTrys(m.ctx, client) + }(m.relayClient) } m.relayClientMu.Unlock()