L: cl.locker(),
},
webSeeds: make(map[string]*Peer),
+ gotMetainfoC: make(chan struct{}),
}
t.networkingEnabled.Set()
t._pendingPieces.NewSet = priorityBitmapStableNewSet
}
// 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
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
}
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()
}
}
}
t.cl.event.Broadcast()
- t.gotMetainfo.Set()
+ close(t.gotMetainfoC)
t.updateWantPeersEvent()
t.pendingRequests = make(map[Request]int)
t.tryCreateMorePieceHashers()