diff options
| -rw-r--r-- | internal/io/signal/signal.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/internal/io/signal/signal.go b/internal/io/signal/signal.go new file mode 100644 index 0000000..bca7e6e --- /dev/null +++ b/internal/io/signal/signal.go @@ -0,0 +1,33 @@ +package signal + +import ( + "context" + "os" + gosignal "os/signal" + "syscall" +) + +// StatsCh returns a channel for "please print stats" signalling. +func StatsCh(ctx context.Context) <-chan struct{} { + sigCh := make(chan os.Signal) + gosignal.Notify(sigCh, syscall.SIGINFO, syscall.SIGUSR1) + + statsCh := make(chan struct{}) + + go func() { + for { + select { + case <-sigCh: + select { + case statsCh <- struct{}{}: + default: + // Stats currently already printed. + } + case <-ctx.Done(): + return + } + } + }() + + return statsCh +} |
