Fix races using resources on Close

This commit is contained in:
Matt Joiner 2021-12-01 18:24:17 +11:00
parent 69f3b6064e
commit 8dc897d4a2
2 changed files with 10 additions and 7 deletions

View File

@ -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
}

View File

@ -81,6 +81,12 @@ func (me *trackerScraper) getIp() (ip net.IP, err error) {
err = errors.New("no ips")
return
}
me.t.cl.rLock()
defer me.t.cl.rUnlock()
if me.t.cl.closed.IsSet() {
err = errors.New("client is closed")
return
}
for _, ip = range ips {
if me.t.cl.ipIsBlocked(ip) {
continue