From d77e939944d3ea6ef50498e19405ee3ff08d846d Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 1 Dec 2017 23:09:07 +1100 Subject: [PATCH] Synchronize access to storage --- torrent.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/torrent.go b/torrent.go index 365c9f86..8f93281c 100644 --- a/torrent.go +++ b/torrent.go @@ -64,6 +64,8 @@ type Torrent struct { storageOpener *storage.Client // Storage for torrent data. storage *storage.Torrent + // Read-locked for using storage, and write-locked for Closing. + storageLock sync.RWMutex metainfo metainfo.MetaInfo @@ -611,7 +613,9 @@ func (t *Torrent) numPiecesCompleted() (num int) { func (t *Torrent) close() (err error) { t.closed.Set() if t.storage != nil { + t.storageLock.Lock() t.storage.Close() + t.storageLock.Unlock() } for conn := range t.conns { conn.Close() @@ -1547,8 +1551,10 @@ func (t *Torrent) verifyPiece(piece int) { } p.hashing = true t.publishPieceChange(piece) + t.storageLock.RLock() cl.mu.Unlock() sum := t.hashPiece(piece) + t.storageLock.RUnlock() cl.mu.Lock() p.hashing = false t.pieceHashed(piece, sum == p.hash)