Remove sync.Cond from piece
It's not trivial to ensure that anyone waiting on the piece Cond will wake on events like the torrent being dropped from the client.
This commit is contained in:
parent
c7f9bfccc1
commit
d01c6221e6
|
@ -1923,7 +1923,7 @@ func (cl *Client) setStorage(t *torrent, td Data) (err error) {
|
|||
type TorrentDataOpener func(*metainfo.Info) Data
|
||||
|
||||
func (cl *Client) setMetaData(t *torrent, md *metainfo.Info, bytes []byte) (err error) {
|
||||
err = t.setMetadata(md, bytes, &cl.mu)
|
||||
err = t.setMetadata(md, bytes)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
@ -2590,7 +2590,7 @@ func (me *Client) downloadedChunk(t *torrent, c *connection, msg *pp.Message) er
|
|||
c.peerTouchedPieces[int(req.Index)] = struct{}{}
|
||||
|
||||
// log.Println("got chunk", req)
|
||||
piece.Event.Broadcast()
|
||||
me.event.Broadcast()
|
||||
defer t.publishPieceChange(int(req.Index))
|
||||
// Record that we have the chunk.
|
||||
piece.unpendChunkIndex(chunkIndex(req.chunkSpec, t.chunkSize))
|
||||
|
@ -2662,7 +2662,7 @@ func (me *Client) pieceChanged(t *torrent, piece int) {
|
|||
correct := t.pieceComplete(piece)
|
||||
p := &t.Pieces[piece]
|
||||
defer t.publishPieceChange(piece)
|
||||
defer p.Event.Broadcast()
|
||||
defer me.event.Broadcast()
|
||||
if correct {
|
||||
p.Priority = PiecePriorityNone
|
||||
p.PendingChunkSpecs = nil
|
||||
|
|
|
@ -99,7 +99,7 @@ func TestTorrentInitialState(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
tor.chunkSize = 2
|
||||
err = tor.setMetadata(&mi.Info.Info, mi.Info.Bytes, nil)
|
||||
err = tor.setMetadata(&mi.Info.Info, mi.Info.Bytes)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
1
piece.go
1
piece.go
|
@ -28,7 +28,6 @@ type piece struct {
|
|||
Hashing bool
|
||||
QueuedForHash bool
|
||||
EverHashed bool
|
||||
Event sync.Cond
|
||||
Priority piecePriority
|
||||
PublicPieceState PieceState
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ func (r *Reader) available(off, max int64) (ret int64) {
|
|||
}
|
||||
|
||||
func (r *Reader) waitReadable(off int64) {
|
||||
r.t.Pieces[off/int64(r.t.usualPieceSize())].Event.Wait()
|
||||
r.t.cl.event.Wait()
|
||||
}
|
||||
|
||||
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
|
||||
|
|
1
t.go
1
t.go
|
@ -2,6 +2,7 @@ package torrent
|
|||
|
||||
import (
|
||||
"github.com/anacrolix/missinggo/pubsub"
|
||||
|
||||
"github.com/anacrolix/torrent/metainfo"
|
||||
)
|
||||
|
||||
|
|
|
@ -232,7 +232,7 @@ func infoPieceHashes(info *metainfo.Info) (ret []string) {
|
|||
}
|
||||
|
||||
// Called when metadata for a torrent becomes available.
|
||||
func (t *torrent) setMetadata(md *metainfo.Info, infoBytes []byte, eventLocker sync.Locker) (err error) {
|
||||
func (t *torrent) setMetadata(md *metainfo.Info, infoBytes []byte) (err error) {
|
||||
err = validateInfo(md)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("bad info: %s", err)
|
||||
|
@ -249,7 +249,6 @@ func (t *torrent) setMetadata(md *metainfo.Info, infoBytes []byte, eventLocker s
|
|||
t.Pieces = make([]piece, len(hashes))
|
||||
for i, hash := range hashes {
|
||||
piece := &t.Pieces[i]
|
||||
piece.Event.L = eventLocker
|
||||
piece.noPendingWrites.L = &piece.pendingWritesMutex
|
||||
missinggo.CopyExact(piece.Hash[:], hash)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue