"github.com/anacrolix/torrent/metainfo"
)
-// Implementations track the completion of pieces.
+// Implementations track the completion of pieces. It must be concurrent-safe.
type pieceCompletion interface {
Get(metainfo.PieceKey) (bool, error)
Set(metainfo.PieceKey, bool) error
package storage
import (
+ "sync"
+
"github.com/anacrolix/torrent/metainfo"
)
type mapPieceCompletion struct {
- m map[metainfo.PieceKey]struct{}
+ mu sync.Mutex
+ m map[metainfo.PieceKey]struct{}
}
func (mapPieceCompletion) Close() error { return nil }
func (me *mapPieceCompletion) Get(pk metainfo.PieceKey) (bool, error) {
+ me.mu.Lock()
_, ok := me.m[pk]
+ me.mu.Unlock()
return ok, nil
}
func (me *mapPieceCompletion) Set(pk metainfo.PieceKey, b bool) error {
+ me.mu.Lock()
if b {
if me.m == nil {
me.m = make(map[metainfo.PieceKey]struct{})
} else {
delete(me.m, pk)
}
+ me.mu.Unlock()
return nil
}