Fix races using resources on Close
This commit is contained in:
parent
69f3b6064e
commit
8dc897d4a2
11
client.go
11
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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue