- service stop: fix race

Service Stop handler sends SIGINT to the main thread,
 which begins the stops the app.
This commit is contained in:
Simon Zolin 2019-07-02 12:56:23 +03:00
parent 5abf0b5a53
commit 131aa4c93c
3 changed files with 9 additions and 6 deletions

View file

@ -51,6 +51,7 @@ type configuration struct {
// runningAsService flag is set to true when options are passed from the service runner // runningAsService flag is set to true when options are passed from the service runner
runningAsService bool runningAsService bool
disableUpdate bool // If set, don't check for updates disableUpdate bool // If set, don't check for updates
appSignalChannel chan os.Signal
BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to BindHost string `yaml:"bind_host"` // BindHost is the IP address of the HTTP server to bind to
BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server BindPort int `yaml:"bind_port"` // BindPort is the port the HTTP server

View file

@ -99,10 +99,10 @@ func run(args options) {
requireAdminRights() requireAdminRights()
} }
signalChannel := make(chan os.Signal) config.appSignalChannel = make(chan os.Signal)
signal.Notify(signalChannel, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) signal.Notify(config.appSignalChannel, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT)
go func() { go func() {
<-signalChannel <-config.appSignalChannel
cleanup() cleanup()
cleanupAlways() cleanupAlways()
os.Exit(0) os.Exit(0)

View file

@ -3,6 +3,7 @@ package home
import ( import (
"os" "os"
"runtime" "runtime"
"syscall"
"github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/log"
"github.com/kardianos/service" "github.com/kardianos/service"
@ -31,9 +32,10 @@ func (p *program) Start(s service.Service) error {
// Stop stops the program // Stop stops the program
func (p *program) Stop(s service.Service) error { func (p *program) Stop(s service.Service) error {
// Stop should not block. Return with a few seconds. // Stop should not block. Return with a few seconds.
cleanup() if config.appSignalChannel == nil {
cleanupAlways() os.Exit(0)
os.Exit(0) }
config.appSignalChannel <- syscall.SIGINT
return nil return nil
} }