From: YenForYang <YenForYang@users.noreply.github.com>
Date: Mon, 13 Sep 2021 01:41:11 +0000 (-0500)
Subject: Simplify (*Torrent).gotMetainfo (#581)
X-Git-Tag: v1.32.0~69
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=5c440e89295c7638308f046f7b44f196b4f9c25e;p=btrtrc.git

Simplify (*Torrent).gotMetainfo (#581)
---

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()