From d01c6221e652881a2becd85b835f0d444602a8d8 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 6 Nov 2015 00:40:16 +1100 Subject: [PATCH] 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. --- client.go | 6 +++--- client_test.go | 2 +- piece.go | 1 - reader.go | 2 +- t.go | 1 + torrent.go | 3 +-- 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client.go b/client.go index fea00be6..2a923649 100644 --- a/client.go +++ b/client.go @@ -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 diff --git a/client_test.go b/client_test.go index b7e4238a..b61d6b1b 100644 --- a/client_test.go +++ b/client_test.go @@ -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) } diff --git a/piece.go b/piece.go index 408dce37..35c8a7b2 100644 --- a/piece.go +++ b/piece.go @@ -28,7 +28,6 @@ type piece struct { Hashing bool QueuedForHash bool EverHashed bool - Event sync.Cond Priority piecePriority PublicPieceState PieceState diff --git a/reader.go b/reader.go index 0d2561d3..e9f130ed 100644 --- a/reader.go +++ b/reader.go @@ -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) { diff --git a/t.go b/t.go index 87ae5d82..fcb57740 100644 --- a/t.go +++ b/t.go @@ -2,6 +2,7 @@ package torrent import ( "github.com/anacrolix/missinggo/pubsub" + "github.com/anacrolix/torrent/metainfo" ) diff --git a/torrent.go b/torrent.go index 7d3e235d..4d524a03 100644 --- a/torrent.go +++ b/torrent.go @@ -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) } -- 2.44.0