Add pending write helpers
This commit is contained in:
parent
94d764e6be
commit
90348f6a48
|
@ -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 {
|
||||
|
|
26
piece.go
26
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()
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue