From 5c440e89295c7638308f046f7b44f196b4f9c25e Mon Sep 17 00:00:00 2001 From: YenForYang Date: Sun, 12 Sep 2021 20:41:11 -0500 Subject: [PATCH] Simplify (*Torrent).gotMetainfo (#581) --- client.go | 1 + t.go | 18 ++++++++++-------- torrent.go | 9 +++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/client.go b/client.go index 5ff6acc4..e47aa082 100644 --- a/client.go +++ b/client.go @@ -1112,6 +1112,7 @@ func (cl *Client) newTorrent(ih metainfo.Hash, specStorage storage.ClientImpl) ( L: cl.locker(), }, webSeeds: make(map[string]*Peer), + gotMetainfoC: make(chan struct{}), } t.networkingEnabled.Set() t._pendingPieces.NewSet = priorityBitmapStableNewSet diff --git a/t.go b/t.go index 153264e9..b42a3f0f 100644 --- a/t.go +++ b/t.go @@ -16,18 +16,20 @@ func (t *Torrent) InfoHash() metainfo.Hash { } // Returns a channel that is closed when the info (.Info()) for the torrent has become available. -func (t *Torrent) GotInfo() <-chan struct{} { +func (t *Torrent) GotInfo() (ret <-chan struct{}) { // TODO: We shouldn't need to lock to take a channel here, if the event is only ever set. - t.cl.lock() - defer t.cl.unlock() - return t.gotMetainfo.C() + t.nameMu.RLock() + ret = t.gotMetainfoC + t.nameMu.RUnlock() + return } // Returns the metainfo info dictionary, or nil if it's not yet available. -func (t *Torrent) Info() *metainfo.Info { - t.cl.lock() - defer t.cl.unlock() - return t.info +func (t *Torrent) Info() (info *metainfo.Info) { + t.nameMu.RLock() + info = t.info + t.nameMu.RUnlock() + return } // Returns a Reader bound to the torrent's data. All read calls block until the data requested is diff --git a/torrent.go b/torrent.go index 27ad3e1e..0481d564 100644 --- a/torrent.go +++ b/torrent.go @@ -122,8 +122,8 @@ type Torrent struct { metadataCompletedChunks []bool metadataChanged sync.Cond - // Set when .Info is obtained. - gotMetainfo missinggo.Event + // Closed when .Info is obtained. + gotMetainfoC chan struct{} readers map[*reader]struct{} _readerNowPieces bitmap.Bitmap @@ -305,10 +305,11 @@ func (t *Torrent) addPeer(p PeerInfo) (added bool) { } func (t *Torrent) invalidateMetadata() { - for i := range t.metadataCompletedChunks { + for i := 0; i < len(t.metadataCompletedChunks); i++ { t.metadataCompletedChunks[i] = false } t.nameMu.Lock() + t.gotMetainfoC = make(chan struct{}) t.info = nil t.nameMu.Unlock() } @@ -438,7 +439,7 @@ func (t *Torrent) onSetInfo() { } } t.cl.event.Broadcast() - t.gotMetainfo.Set() + close(t.gotMetainfoC) t.updateWantPeersEvent() t.pendingRequests = make(map[Request]int) t.tryCreateMorePieceHashers()