return nil
}
}
+ urlString := (*u).String()
+ cl := t.cl
newAnnouncer := &trackerScraper{
u: *u,
t: t,
+ allow: func() {
+ cl.lock()
+ defer cl.unlock()
+ if cl.activeAnnounces == nil {
+ cl.activeAnnounces = make(map[string]struct{})
+ }
+ for {
+ if _, ok := cl.activeAnnounces[urlString]; ok {
+ cl.event.Wait()
+ } else {
+ break
+ }
+ }
+ cl.activeAnnounces[urlString] = struct{}{}
+ },
+ done: func() {
+ cl.lock()
+ defer cl.unlock()
+ delete(cl.activeAnnounces, urlString)
+ cl.event.Broadcast()
+ },
}
go newAnnouncer.Run()
return newAnnouncer
u url.URL
t *Torrent
lastAnnounce trackerAnnounceResult
+ allow, done func()
}
type torrentTrackerAnnouncer interface {
ret.Completed = time.Now()
}()
ret.Interval = time.Minute
+ me.allow()
+ defer me.done()
ip, err := me.getIp()
if err != nil {
ret.Err = fmt.Errorf("error getting ip: %s", err)