"os"
"os/signal"
"strings"
+ "sync"
"syscall"
"github.com/anacrolix/dht/v2"
const TorrentExt = ".torrent"
+var (
+ Cancel = make(chan struct{})
+ Jobs sync.WaitGroup
+)
+
func main() {
log.SetFlags(log.Ldate | log.Ltime)
dhtBoot := flag.String("dht", "dht.cypherpunks.ru:8991", "Comma-separated list of DHT bootstrap nodes")
defer client.Close()
needsShutdown := make(chan os.Signal)
- overallStatusCancel := make(chan struct{})
- txStatsDumperCancel := make(chan struct{})
signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT)
go func() {
<-needsShutdown
- overallStatusCancel <- struct{}{}
- txStatsDumperCancel <- struct{}{}
+ close(Cancel)
client.Close()
}()
fifosPrepare()
log.Println("started", client.PublicIPs())
- go overallStatus(client, overallStatusCancel)
+ Jobs.Add(1)
+ go overallStatus(client)
go fifoList(client)
go fifoDHTList(client)
go fifoAdd(client)
go fifoDel(client)
- go txStatsDumper(client, txStatsDumperCancel)
+ Jobs.Add(1)
+ go txStatsDumper(client)
<-client.Closed()
- <-overallStatusCancel
- <-txStatsDumperCancel
+ Jobs.Wait()
fifosCleanup()
log.Println("finished")
}
"github.com/dustin/go-humanize"
)
-func overallStatus(c *torrent.Client, cancel chan struct{}) {
+func overallStatus(c *torrent.Client) {
tick := time.Tick(time.Second)
var prev torrent.ConnStats
for {
select {
- case <-cancel:
- close(cancel)
+ case <-Cancel:
+ Jobs.Done()
return
case <-tick:
}
}
}
-func txStatsDumper(c *torrent.Client, cancel chan struct{}) {
+func txStatsDumper(c *torrent.Client) {
tick := time.Tick(10 * time.Second)
for {
txStatsDumpAll(c)
select {
- case <-cancel:
- close(cancel)
+ case <-Cancel:
+ Jobs.Done()
return
case <-tick:
}