From: Sergey Matveev Date: Mon, 28 Nov 2022 14:55:14 +0000 (+0300) Subject: Simpler cancellation with global variables X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=6f4d478fee7c0bf82c004c2804a25fc35e002d44;p=btrtrc.git Simpler cancellation with global variables --- diff --git a/cmd/btrtrc/main.go b/cmd/btrtrc/main.go index 70bc8c90..880348be 100644 --- a/cmd/btrtrc/main.go +++ b/cmd/btrtrc/main.go @@ -7,6 +7,7 @@ import ( "os" "os/signal" "strings" + "sync" "syscall" "github.com/anacrolix/dht/v2" @@ -18,6 +19,11 @@ import ( 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") @@ -63,27 +69,25 @@ func main() { 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") } diff --git a/cmd/btrtrc/status.go b/cmd/btrtrc/status.go index 3d937efa..8cb0cbc4 100644 --- a/cmd/btrtrc/status.go +++ b/cmd/btrtrc/status.go @@ -8,13 +8,13 @@ import ( "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: } diff --git a/cmd/btrtrc/txstats.go b/cmd/btrtrc/txstats.go index 6ce62bab..f05a4b8f 100644 --- a/cmd/btrtrc/txstats.go +++ b/cmd/btrtrc/txstats.go @@ -60,13 +60,13 @@ func txStatsDumpAll(c *torrent.Client) { } } -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: }