From a87d0e9f8f0616f64a77939d324b46b6d7813aec Mon Sep 17 00:00:00 2001 From: povsister Date: Tue, 29 Jun 2021 19:43:20 +0800 Subject: [PATCH] fix wrong channel closed in SetupMainSignalHandler (#939) --- global/signal_unix.go | 10 ++++------ global/signal_windows.go | 29 +++++++++++++---------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/global/signal_unix.go b/global/signal_unix.go index b6a88e1..6c4a131 100644 --- a/global/signal_unix.go +++ b/global/signal_unix.go @@ -12,24 +12,22 @@ import ( // SetupMainSignalHandler is for main to use at last func SetupMainSignalHandler() <-chan struct{} { mainOnce.Do(func() { - mc := make(chan os.Signal, 2) + mainStopCh = make(chan struct{}) + mc := make(chan os.Signal, 3) closeOnce := sync.Once{} signal.Notify(mc, os.Interrupt, syscall.SIGTERM, syscall.SIGUSR1) go func() { for { - s := <-mc - switch s { + switch <-mc { case os.Interrupt, syscall.SIGTERM: closeOnce.Do(func() { - close(mc) + close(mainStopCh) }) case syscall.SIGUSR1: dumpStack() } } }() - - mainStopCh = make(chan struct{}) }) return mainStopCh } diff --git a/global/signal_windows.go b/global/signal_windows.go index f098546..42e013c 100644 --- a/global/signal_windows.go +++ b/global/signal_windows.go @@ -18,8 +18,8 @@ import ( ) var ( - validTasks = []string{ - "dumpstack", + validTasks = map[string]func(){ + "dumpstack": dumpStack, } ) @@ -30,11 +30,11 @@ func SetupMainSignalHandler() <-chan struct{} { pipeName := fmt.Sprintf(`\\.\pipe\go-cqhttp-%d`, os.Getpid()) pipe, err := winio.ListenPipe(pipeName, &winio.PipeConfig{}) if err != nil { - log.Error("创建 named pipe 失败. 将无法使用 dumpstack 功能") + log.Errorf("创建 named pipe 失败. 将无法使用 dumpstack 功能: %v", err) } else { maxTaskLen := 0 - for i := range validTasks { - if l := len(validTasks[i]); l > maxTaskLen { + for t := range validTasks { + if l := len(t); l > maxTaskLen { maxTaskLen = l } } @@ -58,27 +58,26 @@ func SetupMainSignalHandler() <-chan struct{} { return } cmd := string(buf[:n]) - switch cmd { - case "dumpstack": - dumpStack() - default: - log.Warnf("named pipe 读取到未知指令: %q", cmd) + if task, ok := validTasks[cmd]; ok { + task() + return } + log.Warnf("named pipe 读取到未知指令: %q", cmd) }() } }() } - + // setup the main stop channel + mainStopCh = make(chan struct{}) mc := make(chan os.Signal, 2) closeOnce := sync.Once{} signal.Notify(mc, os.Interrupt, syscall.SIGTERM) go func() { for { - s := <-mc - switch s { + switch <-mc { case os.Interrupt, syscall.SIGTERM: closeOnce.Do(func() { - close(mc) + close(mainStopCh) if pipe != nil { _ = pipe.Close() } @@ -86,8 +85,6 @@ func SetupMainSignalHandler() <-chan struct{} { } } }() - - mainStopCh = make(chan struct{}) }) return mainStopCh }