]> Sergey Matveev's repositories - btrtrc.git/blobdiff - client.go
Fix races using resources on Close
[btrtrc.git] / client.go
index bd03da3561a4da8d8ebeb308b95ebbc6c42e4fb4..c491118b04d905413e2ec08556641d56ac774072 100644 (file)
--- a/client.go
+++ b/client.go
@@ -422,26 +422,23 @@ func (cl *Client) eachDhtServer(f func(DhtServer)) {
        }
 }
 
-// Stops the client. All connections to peers are closed and all activity will
-// come to a halt.
+// Stops the client. All connections to peers are closed and all activity will come to a halt.
 func (cl *Client) Close() (errs []error) {
-       cl.closed.Set()
        var closeGroup sync.WaitGroup // For concurrent cleanup to complete before returning
        cl.lock()
-       cl.event.Broadcast()
        for _, t := range cl.torrents {
                err := t.close(&closeGroup)
                if err != nil {
                        errs = append(errs, err)
                }
        }
-       cl.unlock()
-       closeGroup.Wait() // defer is LIFO. We want to Wait() after cl.unlock()
-       cl.lock()
        for i := range cl.onClose {
                cl.onClose[len(cl.onClose)-1-i]()
        }
+       cl.closed.Set()
        cl.unlock()
+       cl.event.Broadcast()
+       closeGroup.Wait() // defer is LIFO. We want to Wait() after cl.unlock()
        return
 }