]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add pending write helpers
authorMatt Joiner <anacrolix@gmail.com>
Sun, 24 Jan 2016 20:22:33 +0000 (07:22 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 24 Jan 2016 20:22:33 +0000 (07:22 +1100)
client.go
piece.go
reader.go
torrent.go

index 007186e91fd1613c4cae86ca84b3db98cea7f4fc..422180deed3345ef38f618a7afcd6fd0bb2d5fa5 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1357,11 +1357,7 @@ func (me *Client) sendChunk(t *torrent, c *connection, r request) error {
        c.chunksSent++
        b := make([]byte, r.Length)
        tp := &t.Pieces[r.Index]
-       tp.pendingWritesMutex.Lock()
-       for tp.pendingWrites != 0 {
-               tp.noPendingWrites.Wait()
-       }
-       tp.pendingWritesMutex.Unlock()
+       tp.waitNoPendingWrites()
        p := t.Info.Piece(int(r.Index))
        n, err := dataReadAt(t.data, b, p.Offset()+int64(r.Begin))
        if err != nil {
index 518e76bbf486d4772e81a167303c2518cad450a1..1c86b7eae305899cc0056a4fdc5d02e6e1b20b02 100644 (file)
--- a/piece.go
+++ b/piece.go
@@ -92,3 +92,29 @@ func (p *piece) shuffledPendingChunkSpecs(t *torrent, piece int) (css []chunkSpe
        }
        return
 }
+
+func (p *piece) incrementPendingWrites() {
+       p.pendingWritesMutex.Lock()
+       p.pendingWrites++
+       p.pendingWritesMutex.Unlock()
+}
+
+func (p *piece) decrementPendingWrites() {
+       p.pendingWritesMutex.Lock()
+       if p.pendingWrites == 0 {
+               panic("assertion")
+       }
+       p.pendingWrites--
+       if p.pendingWrites == 0 {
+               p.noPendingWrites.Broadcast()
+       }
+       p.pendingWritesMutex.Unlock()
+}
+
+func (p *piece) waitNoPendingWrites() {
+       p.pendingWritesMutex.Lock()
+       for p.pendingWrites != 0 {
+               p.noPendingWrites.Wait()
+       }
+       p.pendingWritesMutex.Unlock()
+}
index 3d04b35ca53512ade112a0cbe8e938467965c241..8c3fa56fafcee0593cffe0411d8d4bb2b0892608 100644 (file)
--- a/reader.go
+++ b/reader.go
@@ -118,11 +118,7 @@ again:
        if int64(len(b1)) > ip.Length()-po {
                b1 = b1[:ip.Length()-po]
        }
-       tp.pendingWritesMutex.Lock()
-       for tp.pendingWrites != 0 {
-               tp.noPendingWrites.Wait()
-       }
-       tp.pendingWritesMutex.Unlock()
+       tp.waitNoPendingWrites()
        n, err = dataReadAt(r.t.torrent.data, b1, pos)
        if n != 0 {
                err = nil
index 924561cd6d317b0d0eb9ec8cf1f3fb753fab86f7..38990144eef6b587a4200c37c5bd02385b9ceeac 100644 (file)
@@ -645,11 +645,7 @@ func (t *torrent) pieceLength(piece int) (len_ pp.Integer) {
 func (t *torrent) hashPiece(piece int) (ps pieceSum) {
        hash := pieceHash.New()
        p := &t.Pieces[piece]
-       p.pendingWritesMutex.Lock()
-       for p.pendingWrites != 0 {
-               p.noPendingWrites.Wait()
-       }
-       p.pendingWritesMutex.Unlock()
+       p.waitNoPendingWrites()
        pl := t.Info.Piece(int(piece)).Length()
        n, err := t.data.WriteSectionTo(hash, int64(piece)*t.Info.PieceLength, pl)
        if err != nil {