From: Matt Joiner Date: Fri, 1 Dec 2017 12:09:07 +0000 (+1100) Subject: Synchronize access to storage X-Git-Tag: v1.0.0~321 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=d77e939944d3ea6ef50498e19405ee3ff08d846d;p=btrtrc.git Synchronize access to storage --- 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)