]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Remove sync.Cond from piece
authorMatt Joiner <anacrolix@gmail.com>
Thu, 5 Nov 2015 13:40:16 +0000 (00:40 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 5 Nov 2015 13:40:16 +0000 (00:40 +1100)
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
client_test.go
piece.go
reader.go
t.go
torrent.go

index fea00be6a378bc24a0b8429a2d074c7ef8e1d1d6..2a923649c84e4f7ccd4856d917d9d8a49f165bf8 100644 (file)
--- 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
index b7e4238a6eda662970b5c36927f3a649b63eabb2..b61d6b1bd91fc4656ed994cc2728c716be45e94c 100644 (file)
@@ -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)
        }
index 408dce376911ad73c0c469b9c1b953e047b2f80d..35c8a7b2ded8619f180889ba638006312bad900d 100644 (file)
--- 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
 
index 0d2561d3de6166bdd8f6a9657fc26cb5f03168ed..e9f130ed00495c8161d03f5c7896505df48c089b 100644 (file)
--- 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 87ae5d82e5a26a7a4595ebd1ae03b90751cb6568..fcb57740f7287cc9367c7b329a47014e6be09a55 100644 (file)
--- a/t.go
+++ b/t.go
@@ -2,6 +2,7 @@ package torrent
 
 import (
        "github.com/anacrolix/missinggo/pubsub"
+
        "github.com/anacrolix/torrent/metainfo"
 )
 
index 7d3e235d34e9538d83a0027ac7c5749239926d7f..4d524a03e92829b3309a794a31bf7a64d8cc12af 100644 (file)
@@ -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)
        }