client.go | 5 +++++ torrent.go | 12 ++++++++++-- diff --git a/client.go b/client.go index e4e9cecbd1b07f112478274bd086478422a8afcb..ecbbcc4ce55ceb5d0b8415a68e4cf9b87ca2fb6a 100644 --- a/client.go +++ b/client.go @@ -961,6 +961,8 @@ func newTorrent(ih InfoHash, announceList [][]string) (t *torrent, err error) { t = &torrent{ InfoHash: ih, Peers: make(map[peersKey]Peer, 2000), + + closing: make(chan struct{}), } t.Trackers = make([][]tracker.Client, len(announceList)) for tierIndex := range announceList { @@ -1115,6 +1117,9 @@ if err != nil { log.Printf("error adding peers from dht for torrent %q: %s", t, err) break getPeers } + case <-t.closing: + ps.Close() + return } } ps.Close() diff --git a/torrent.go b/torrent.go index 07a18c4878883a11f387496555f28ec051d88972..82256f1e4284dbaa8c197de3bb38cdc5db343ff2 100644 --- a/torrent.go +++ b/torrent.go @@ -334,11 +334,19 @@ return t.length } func (t *torrent) isClosed() bool { - return t.closed + select { + case <-t.closing: + return true + default: + return false + } } func (t *torrent) Close() (err error) { - t.closed = true + if t.isClosed() { + return + } + close(t.closing) t.dataLock.Lock() t.Data.Close() t.Data = nil