summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/io/signal/signal.go33
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
+}