From 7a5dc076ff37f4cfb3abe6be61a1a5a5696dd940 Mon Sep 17 00:00:00 2001 From: Ni Rui Date: Thu, 15 Sep 2022 17:10:50 +0800 Subject: [PATCH] Fixed double closing of `closeNotify` channel which could happen during shutdown --- application/application.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/application/application.go b/application/application.go index 671782c..a8967c4 100644 --- a/application/application.go +++ b/application/application.go @@ -100,8 +100,18 @@ func (a Application) run( } closeNotify := closeSigBuilder() + closeNotifyDisableLock := sync.Mutex{} signal.Notify(closeNotify, os.Kill, os.Interrupt, syscall.SIGHUP) - defer signal.Stop(closeNotify) + defer func() { + closeNotifyDisableLock.Lock() + defer closeNotifyDisableLock.Unlock() + if closeNotify == nil { + return + } + signal.Stop(closeNotify) + close(closeNotify) + closeNotify = nil + }() servers := make([]*server.Serving, 0, len(c.Servers)) s := server.New(a.logger) @@ -110,47 +120,37 @@ func (a Application) run( for i := len(servers); i > 0; i-- { servers[i-1].Close() } - s.Wait() }() - closeNotifyDisableLock := sync.Mutex{} - for _, ss := range c.Servers { newServer := s.Serve(c.Common(), ss, func(e error) { closeNotifyDisableLock.Lock() defer closeNotifyDisableLock.Unlock() - if closeNotify == nil { return } - err = e - + signal.Stop(closeNotify) close(closeNotify) closeNotify = nil }, handlerBuilder(commands)) - servers = append(servers, newServer) } switch <-closeNotify { case syscall.SIGHUP: return true, nil - case syscall.SIGTERM: fallthrough case os.Kill: fallthrough case os.Interrupt: a.screen.Write(screenLineWipper) - return false, nil - default: closeNotifyDisableLock.Lock() defer closeNotifyDisableLock.Unlock() - return false, err } }