]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix issue #95: Closing torrent storage also closed client storage for some storage...
authorMatt Joiner <anacrolix@gmail.com>
Fri, 8 Jul 2016 14:36:32 +0000 (00:36 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 8 Jul 2016 14:36:32 +0000 (00:36 +1000)
storage/file.go
storage/mmap.go

index 15f7ebdbe854730e65925f1508f0cfb5c502c2d0..257d92a3f6a3f2f39c9788327ac1a55cd22c5bdd 100644 (file)
@@ -14,48 +14,50 @@ import (
 // File-based storage for torrents, that isn't yet bound to a particular
 // torrent.
 type fileStorage struct {
-       baseDir    string
-       completion pieceCompletion
+       baseDir string
 }
 
 func NewFile(baseDir string) Client {
        return &fileStorage{
-               baseDir:    baseDir,
-               completion: pieceCompletionForDir(baseDir),
+               baseDir: baseDir,
        }
 }
 
 func (fs *fileStorage) OpenTorrent(info *metainfo.InfoEx) (Torrent, error) {
-       return fileTorrentStorage{fs}, nil
+       return &fileTorrentStorage{
+               fs,
+               pieceCompletionForDir(fs.baseDir),
+       }, nil
 }
 
 // File-based torrent storage, not yet bound to a Torrent.
 type fileTorrentStorage struct {
-       *fileStorage
+       fs         *fileStorage
+       completion pieceCompletion
 }
 
-func (fs *fileStorage) Piece(p metainfo.Piece) Piece {
+func (fts *fileTorrentStorage) Piece(p metainfo.Piece) Piece {
        // Create a view onto the file-based torrent storage.
        _io := &fileStorageTorrent{
                p.Info,
-               fs.baseDir,
+               fts.fs.baseDir,
        }
        // Return the appropriate segments of this.
        return &fileStoragePiece{
-               fs,
+               fts,
                p,
                missinggo.NewSectionWriter(_io, p.Offset(), p.Length()),
                io.NewSectionReader(_io, p.Offset(), p.Length()),
        }
 }
 
-func (fs *fileStorage) Close() error {
+func (fs *fileTorrentStorage) Close() error {
        fs.completion.Close()
        return nil
 }
 
 type fileStoragePiece struct {
-       *fileStorage
+       *fileTorrentStorage
        p metainfo.Piece
        io.WriterAt
        io.ReaderAt
index d3f9235aee792b3703f2bd22edc68b735d249dea..836b6f0f104f7daf73238f62f9fe30cd4c30c529 100644 (file)
@@ -14,14 +14,12 @@ import (
 )
 
 type mmapStorage struct {
-       baseDir    string
-       completion pieceCompletion
+       baseDir string
 }
 
 func NewMMap(baseDir string) Client {
        return &mmapStorage{
-               baseDir:    baseDir,
-               completion: pieceCompletionForDir(baseDir),
+               baseDir: baseDir,
        }
 }
 
@@ -29,7 +27,7 @@ func (s *mmapStorage) OpenTorrent(info *metainfo.InfoEx) (t Torrent, err error)
        span, err := mMapTorrent(&info.Info, s.baseDir)
        t = &mmapTorrentStorage{
                span: span,
-               pc:   s.completion,
+               pc:   pieceCompletionForDir(s.baseDir),
        }
        return
 }