veyron/lib/signals: fixing logic to remove STOP from signals passed to
ShutdownOnSignals. Add tests to ensure correctness.
Change-Id: Ia8cfbff9a39d2274d26f39519e76fdc9fa84f878
diff --git a/lib/signals/signals.go b/lib/signals/signals.go
index e9b88fe..75ed785 100644
--- a/lib/signals/signals.go
+++ b/lib/signals/signals.go
@@ -39,28 +39,28 @@
// signals we get on account of the channel being full.
ch := make(chan os.Signal, 2)
sawStop := false
- for i := 0; i < len(signals); {
- if s := signals[i]; s == STOP {
- signals = append(signals[:i], signals[i+1:]...)
- if sawStop {
- continue
+ var signalsNoStop []os.Signal
+ for _, s := range signals {
+ switch s {
+ case STOP:
+ if !sawStop {
+ sawStop = true
+ if r := rt.R(); r != nil {
+ stopWaiter := make(chan string, 1)
+ r.WaitForStop(stopWaiter)
+ go func() {
+ for {
+ ch <- stopSignal(<-stopWaiter)
+ }
+ }()
+ }
}
- sawStop = true
- if r := rt.R(); r != nil {
- stopWaiter := make(chan string, 1)
- r.WaitForStop(stopWaiter)
- go func() {
- for {
- ch <- stopSignal(<-stopWaiter)
- }
- }()
- }
- } else {
- i++
+ default:
+ signalsNoStop = append(signalsNoStop, s)
}
}
- if len(signals) > 0 {
- signal.Notify(ch, signals...)
+ if len(signalsNoStop) > 0 {
+ signal.Notify(ch, signalsNoStop...)
}
// At least a buffer of length one so that we don't block on ret <- sig.
ret := make(chan os.Signal, 1)