]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Hold client lock as little as possible in Reader.readAt
authorMatt Joiner <anacrolix@gmail.com>
Fri, 17 Jul 2015 10:59:26 +0000 (20:59 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 17 Jul 2015 10:59:26 +0000 (20:59 +1000)
reader.go

index 0ba8d5117016971db7bb4a68fa8f8b9295a9360a..c9a0675eb21cf910ac24ef1c9c8695e978efb41a 100644 (file)
--- 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]