client.go | 6 +----- piece.go | 26 ++++++++++++++++++++++++++ reader.go | 6 +----- torrent.go | 6 +----- diff --git a/client.go b/client.go index 007186e91fd1613c4cae86ca84b3db98cea7f4fc..422180deed3345ef38f618a7afcd6fd0bb2d5fa5 100644 --- a/client.go +++ b/client.go @@ -1357,11 +1357,7 @@ // Count the chunk being sent, even if it isn't. 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 { diff --git a/piece.go b/piece.go index 518e76bbf486d4772e81a167303c2518cad450a1..1c86b7eae305899cc0056a4fdc5d02e6e1b20b02 100644 --- a/piece.go +++ b/piece.go @@ -92,3 +92,29 @@ css[i], css[j] = css[j], css[i] } 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() +} diff --git a/reader.go b/reader.go index 3d04b35ca53512ade112a0cbe8e938467965c241..8c3fa56fafcee0593cffe0411d8d4bb2b0892608 100644 --- a/reader.go +++ b/reader.go @@ -118,11 +118,7 @@ po := pos % ip.Length() 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 diff --git a/torrent.go b/torrent.go index 924561cd6d317b0d0eb9ec8cf1f3fb753fab86f7..38990144eef6b587a4200c37c5bd02385b9ceeac 100644 --- a/torrent.go +++ b/torrent.go @@ -645,11 +645,7 @@ 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 {