From: Matt Joiner Date: Fri, 17 Jul 2015 10:59:26 +0000 (+1000) Subject: Hold client lock as little as possible in Reader.readAt X-Git-Tag: v1.0.0~1119 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=4d3b6e5116eb627b636f069c0496bacccf41f08a;p=btrtrc.git Hold client lock as little as possible in Reader.readAt --- 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]