import (
"io"
"log"
+ "sync"
"github.com/edsrzf/mmap-go"
)
}
type MMapSpan struct {
+ mu sync.RWMutex
span
}
ms.span = append(ms.span, segment{&mmap})
}
-func (ms MMapSpan) Close() error {
+func (ms *MMapSpan) Close() error {
+ ms.mu.Lock()
+ defer ms.mu.Unlock()
for _, mMap := range ms.span {
err := mMap.(segment).Unmap()
if err != nil {
return nil
}
-func (ms MMapSpan) Size() (ret int64) {
+func (ms *MMapSpan) Size() (ret int64) {
+ ms.mu.RLock()
+ defer ms.mu.RUnlock()
for _, seg := range ms.span {
ret += seg.Size()
}
return
}
-func (ms MMapSpan) ReadAt(p []byte, off int64) (n int, err error) {
+func (ms *MMapSpan) ReadAt(p []byte, off int64) (n int, err error) {
+ ms.mu.RLock()
+ defer ms.mu.RUnlock()
ms.ApplyTo(off, func(intervalOffset int64, interval sizer) (stop bool) {
_n := copy(p, (*interval.(segment).MMap)[intervalOffset:])
p = p[_n:]
return
}
-func (ms MMapSpan) WriteAt(p []byte, off int64) (n int, err error) {
+func (ms *MMapSpan) WriteAt(p []byte, off int64) (n int, err error) {
+ ms.mu.RLock()
+ defer ms.mu.RUnlock()
ms.ApplyTo(off, func(iOff int64, i sizer) (stop bool) {
mMap := i.(segment)
_n := copy((*mMap.MMap)[iOff:], p)
pc: ts.pc,
p: p,
ih: ts.infoHash,
- ReaderAt: io.NewSectionReader(ts.span, p.Offset(), p.Length()),
- WriterAt: missinggo.NewSectionWriter(ts.span, p.Offset(), p.Length()),
+ ReaderAt: io.NewSectionReader(&ts.span, p.Offset(), p.Length()),
+ WriterAt: missinggo.NewSectionWriter(&ts.span, p.Offset(), p.Length()),
}
}