]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix races stopping clients and closing connections
authorMatt Joiner <anacrolix@gmail.com>
Thu, 20 Mar 2014 11:01:56 +0000 (22:01 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 20 Mar 2014 11:01:56 +0000 (22:01 +1100)
client.go

index f7b5ebaeee560bf2ca858e12ac93a722357754a8..629b708b7f6bc3544c6b6cfb9b450f793b8fb335 100644 (file)
--- a/client.go
+++ b/client.go
@@ -539,6 +539,7 @@ func (cl *Client) stopped() bool {
 }
 
 func (me *Client) Stop() {
+       me.Lock()
        close(me.quit)
        me.event.Broadcast()
        for _, t := range me.torrents {
@@ -546,6 +547,7 @@ func (me *Client) Stop() {
                        c.Close()
                }
        }
+       me.Unlock()
 }
 
 func (cl *Client) acceptConnections() {
@@ -679,7 +681,13 @@ func (me *Client) runConnection(sock net.Conn, torrent *Torrent) (err error) {
                write:      make(chan []byte),
                post:       make(chan encoding.BinaryMarshaler),
        }
-       defer conn.Close()
+       defer func() {
+               // There's a lock and deferred unlock later in this function. The
+               // client will not be locked when this deferred is invoked.
+               me.mu.Lock()
+               defer me.mu.Unlock()
+               conn.Close()
+       }()
        go conn.writer()
        go conn.writeOptimizer()
        conn.post <- peer_protocol.Bytes(peer_protocol.Protocol)