From 4d3b6e5116eb627b636f069c0496bacccf41f08a Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 17 Jul 2015 20:59:26 +1000 Subject: [PATCH] Hold client lock as little as possible in Reader.readAt --- reader.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reader.go b/reader.go index 0ba8d511..c9a0675e 100644 --- a/reader.go +++ b/reader.go @@ -102,8 +102,6 @@ func (r *Reader) readAt(b []byte, pos int64) (n int, err error) { // defer func() { // log.Println(pos, n, err) // }() - r.t.cl.mu.Lock() - defer r.t.cl.mu.Unlock() maxLen := r.t.torrent.Info.TotalLength() - pos if maxLen <= 0 { err = io.EOF @@ -113,6 +111,7 @@ func (r *Reader) readAt(b []byte, pos int64) (n int, err error) { b = b[:maxLen] } again: + r.t.cl.mu.Lock() r.raisePriorities(pos, len(b)) for !r.readable(pos) { r.raisePriorities(pos, len(b)) @@ -120,6 +119,7 @@ again: } avail := r.available(pos, int64(len(b))) // log.Println("available", avail) + r.t.cl.mu.Unlock() b1 := b[:avail] pi := int(pos / r.t.Info().PieceLength) tp := r.t.torrent.Pieces[pi] -- 2.44.0