Restructuring update/download threads.

This commit is contained in:
Greg 2019-03-15 12:41:32 -04:00
parent 9a8aa9d21d
commit e609afeb02
1 changed files with 41 additions and 35 deletions

76
main.go
View File

@ -203,6 +203,7 @@ type dlQueue struct {
respch chan *grab.Response
sync.Mutex
wg sync.WaitGroup
wake chan struct{}
}
func (q *dlQueue) Sort() {
@ -225,6 +226,7 @@ func (q *dlQueue) Waiting() *dlQueue {
respch: q.respch,
Mutex: q.Mutex,
wg: q.wg,
wake: q.wake,
}
for _,i := range q.items {
if i.downloading == false {
@ -258,7 +260,7 @@ func NewDaemon(conf Config, pl *pcList) *Daemon {
conf: conf,
g: grab.NewClient(),
pl: pl,
queue: &dlQueue{},
queue: &dlQueue{ wake: make(chan struct{}) },
dlwake: make(chan struct{}),
}
}
@ -282,7 +284,7 @@ func (d *Daemon) Monitor() {
100*resp.Progress())
}
mon := func(resp *grab.Response) {
t := time.NewTicker(1 * time.Second)
t := time.NewTicker(5 * time.Second)
defer t.Stop()
Loop:
for {
@ -303,7 +305,7 @@ func (d *Daemon) Monitor() {
}
}
func (d *Daemon) Downloader() {
func (d *Daemon) StartDownloader() {
log.Print("Downloader(): starting")
d.queue.reqch = make(chan *grab.Request)
d.queue.respch = make(chan *grab.Response)
@ -323,38 +325,44 @@ func (d *Daemon) Downloader() {
d.queue.items = make([]*dlItem,0)
d.queue.Unlock()
}
upd := make(chan struct{})
go func() {
t := time.NewTicker(30 * time.Second)
defer t.Stop()
for {
// lock Podcast list and update download queue
log.Print("Downloader(): Updating podcast list")
d.queue.Lock()
for _,p := range d.pl.Podcasts {
for _,i := range p.Items {
d.queue.Add(&i)
}
}
log.Print("Downloader(): Done updating podcast list")
d.queue.Unlock()
upd<- struct{}{}
select {
case <-t.C:
continue
case <-d.dlwake:
continue
go d.QueueUpdater()
go d.queue.Downloader()
}
func (d *Daemon) QueueUpdater() {
t := time.NewTicker(30 * time.Second)
defer t.Stop()
for {
// lock Podcast list and update download queue
log.Print("QueueUpdater(): Updating download queue")
d.queue.Lock()
for _,p := range d.pl.Podcasts {
for _,i := range p.Items {
d.queue.Add(&i)
}
}
}()
log.Print("QueueUpdater(): Done updating download queue")
d.queue.Unlock()
d.queue.wake<- struct{}{}
log.Print("QueueUpdater(): Sleeping")
select {
case <-t.C:
continue
case <-d.dlwake:
continue
}
}
}
func (q *dlQueue) Downloader() {
t := time.NewTicker(30 * time.Second)
defer t.Stop()
LOOP:
for {
t := time.NewTicker(30 * time.Second)
defer t.Stop()
// launch requests for files we are not yet downloading
d.queue.Lock()
waiting := d.queue.Waiting()
d.queue.Unlock()
q.Lock()
waiting := q.Waiting()
q.Unlock()
log.Print("Download queue length: ",len(waiting.items))
for _,i := range waiting.items {
if !i.downloading {
@ -366,18 +374,17 @@ func (d *Daemon) Downloader() {
}
i.downloading = true
t := time.Now()
d.queue.reqch <- req
q.reqch <- req
if time.Now().After(t.Add(5 * time.Second)) {
continue LOOP // refresh list
}
}
}
log.Print("Downloader(): Done launching downloads")
log.Print("Downloader(): sleeping")
select {
case <-t.C:
continue
case <-upd:
case <-q.wake:
continue
}
}
@ -385,7 +392,7 @@ func (d *Daemon) Downloader() {
func (d *Daemon) Updater() {
log.Print("Updater(): starting")
go d.Downloader()
d.StartDownloader()
for {
time.Sleep(1 * time.Second)
d.Update(d.conf.Urls)
@ -399,7 +406,6 @@ func (d *Daemon) Updater() {
enc.Encode(d.pl)
d.Unlock()
of.Close()
log.Print("Updater(): done writing")
}
d.dlwake <-struct{}{}
time.Sleep(30 * time.Minute)