From 34afc93ddcf3339d508a5c9e318aa4310bf4034a Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Tue, 29 Dec 2020 15:20:30 +0100 Subject: [PATCH] ui/progress: extract signal handling into own package --- internal/ui/progress/counter.go | 17 +++---------- internal/ui/signals/signals.go | 24 +++++++++++++++++++ .../ui/{progress => signals}/signals_bsd.go | 2 +- .../ui/{progress => signals}/signals_sysv.go | 2 +- .../{progress => signals}/signals_windows.go | 2 +- 5 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 internal/ui/signals/signals.go rename internal/ui/{progress => signals}/signals_bsd.go (91%) rename internal/ui/{progress => signals}/signals_sysv.go (88%) rename internal/ui/{progress => signals}/signals_windows.go (58%) diff --git a/internal/ui/progress/counter.go b/internal/ui/progress/counter.go index 3e6a50c2c..bf4906978 100644 --- a/internal/ui/progress/counter.go +++ b/internal/ui/progress/counter.go @@ -1,11 +1,11 @@ package progress import ( - "os" "sync" "time" "github.com/restic/restic/internal/debug" + "github.com/restic/restic/internal/ui/signals" ) // A Func is a callback for a Counter. @@ -31,11 +31,6 @@ type Counter struct { // New starts a new Counter. func New(interval time.Duration, report Func) *Counter { - signals.Once.Do(func() { - signals.ch = make(chan os.Signal, 1) - setupSignals() - }) - c := &Counter{ report: report, start: time.Now(), @@ -93,12 +88,13 @@ func (c *Counter) run() { if c.tick != nil { tick = c.tick.C } + signalsCh := signals.GetProgressChannel() for { var now time.Time select { case now = <-tick: - case sig := <-signals.ch: + case sig := <-signalsCh: debug.Log("Signal received: %v\n", sig) now = time.Now() case <-c.stop: @@ -108,10 +104,3 @@ func (c *Counter) run() { c.report(c.get(), now.Sub(c.start), false) } } - -// XXX The fact that signals is a single global variable means that only one -// Counter receives each incoming signal. -var signals struct { - ch chan os.Signal - sync.Once -} diff --git a/internal/ui/signals/signals.go b/internal/ui/signals/signals.go new file mode 100644 index 000000000..48343de2b --- /dev/null +++ b/internal/ui/signals/signals.go @@ -0,0 +1,24 @@ +package signals + +import ( + "os" + "sync" +) + +// GetProgressChannel returns a channel with which a single listener +// receives each incoming signal. +func GetProgressChannel() <-chan os.Signal { + signals.Once.Do(func() { + signals.ch = make(chan os.Signal, 1) + setupSignals() + }) + + return signals.ch +} + +// XXX The fact that signals is a single global variable means that only one +// listener receives each incoming signal. +var signals struct { + ch chan os.Signal + sync.Once +} diff --git a/internal/ui/progress/signals_bsd.go b/internal/ui/signals/signals_bsd.go similarity index 91% rename from internal/ui/progress/signals_bsd.go rename to internal/ui/signals/signals_bsd.go index 7d0ecb0be..be3ab8882 100644 --- a/internal/ui/progress/signals_bsd.go +++ b/internal/ui/signals/signals_bsd.go @@ -1,6 +1,6 @@ // +build darwin dragonfly freebsd netbsd openbsd -package progress +package signals import ( "os/signal" diff --git a/internal/ui/progress/signals_sysv.go b/internal/ui/signals/signals_sysv.go similarity index 88% rename from internal/ui/progress/signals_sysv.go rename to internal/ui/signals/signals_sysv.go index 933cddde6..a3b4eb29e 100644 --- a/internal/ui/progress/signals_sysv.go +++ b/internal/ui/signals/signals_sysv.go @@ -1,6 +1,6 @@ // +build aix linux solaris -package progress +package signals import ( "os/signal" diff --git a/internal/ui/progress/signals_windows.go b/internal/ui/signals/signals_windows.go similarity index 58% rename from internal/ui/progress/signals_windows.go rename to internal/ui/signals/signals_windows.go index e8dd4ba0e..2c09fd8f1 100644 --- a/internal/ui/progress/signals_windows.go +++ b/internal/ui/signals/signals_windows.go @@ -1,3 +1,3 @@ -package progress +package signals func setupSignals() {}