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 {
}
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()
+}
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
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 {