"github.com/anacrolix/torrent/segments"
)
+const fdCacheAliveTime = 10
+
type fdCacheEntry struct {
- fd *os.File
+ last int64
+ fd *os.File
sync.Mutex
}
)
func fdCacheCleaner() {
- cleaner := func(c *map[string]*fdCacheEntry, m *sync.Mutex) {
+ cleaner := func(c map[string]*fdCacheEntry, m *sync.Mutex) {
+ now := time.Now().Unix()
m.Lock()
- prev := fdRCache
- *c = make(map[string]*fdCacheEntry)
- m.Unlock()
- for _, v := range prev {
- v.Lock()
- v.fd.Close()
- v.Unlock()
+ for k, v := range c {
+ if now-v.last > fdCacheAliveTime {
+ go func() {
+ v.Lock()
+ v.fd.Close()
+ v.Unlock()
+ }()
+ }
+ delete(c, k)
}
+ m.Unlock()
}
- for range time.Tick(10 * time.Second) {
- cleaner(&fdRCache, &fdRCacheM)
- cleaner(&fdWCache, &fdWCacheM)
+ for range time.Tick(fdCacheAliveTime * time.Second) {
+ cleaner(fdRCache, &fdRCacheM)
+ cleaner(fdWCache, &fdWCacheM)
}
}
b = b[:file.length-off]
}
centry.Lock()
+ centry.last = time.Now().Unix()
n, err = centry.fd.ReadAt(b, off)
centry.Unlock()
return
fdWCacheM.Unlock()
var n1 int
centry.Lock()
+ centry.last = time.Now().Unix()
n1, err = centry.fd.WriteAt(p[:e.Length], e.Start)
centry.Unlock()
n += n1