From 96f308771b4dc5bd28ca6a2b5dca1aa090fce0eb Mon Sep 17 00:00:00 2001 From: Jehiah Czebotar Date: Tue, 1 Dec 2020 09:20:25 -0500 Subject: [PATCH] svc/windows: support closing via context.Done() --- svc/svc_windows.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/svc/svc_windows.go b/svc/svc_windows.go index a2ce8ed..74a90bf 100644 --- a/svc/svc_windows.go +++ b/svc/svc_windows.go @@ -114,7 +114,16 @@ func (ws *windowsService) run() error { signalChan := make(chan os.Signal, 1) signalNotify(signalChan, ws.signals...) - <-signalChan + + var doneChan <-chan struct{} + if s, ok := ws.i.(Context); ok { + doneChan = ws.i.Context().Done() + } + + select { + case <-signalChan: + case <-doneChan: + } err = ws.i.Stop() @@ -133,8 +142,26 @@ func (ws *windowsService) Execute(args []string, r <-chan wsvc.ChangeRequest, ch changes <- wsvc.Status{State: wsvc.Running, Accepts: cmdsAccepted} loop: + + var doneChan <-chan struct{} + if s, ok := ws.i.(Context); ok { + doneChan = ws.i.Context().Done() + } + for { - c := <-r + var c wsvc.ChangeRequest + select { + case c <- r: + case <-doneChan: + changes <- wsvc.Status{State: wsvc.StopPending} + err := ws.i.Stop() + if err != nil { + ws.setError(err) + return true, 2 + } + break loop + } + switch c.Cmd { case wsvc.Interrogate: changes <- c.CurrentStatus