Skip to content

Commit

Permalink
fix(launcher): signal may be ignored
Browse files Browse the repository at this point in the history
  • Loading branch information
SuzukiHonoka committed Aug 14, 2024
1 parent 36be93b commit eac0384
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 12 deletions.
20 changes: 10 additions & 10 deletions api/launcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,6 @@ func (l *Launcher) launchClient(ctx context.Context, cfg *config.MixedConfig) er
return fmt.Errorf("init client failed: %w", err)
}

// interrupt flag
var signalArrived bool

// error channel for http/socks server
errChan := make(chan error)

Expand All @@ -76,9 +73,10 @@ func (l *Launcher) launchClient(ctx context.Context, cfg *config.MixedConfig) er
s := socks.New(ctx, socksCfg)
defer utils.Close(s)
go func() {
if err := s.ListenAndServe("tcp", cfg.ListenSocks); err != nil && !signalArrived {
if err := s.ListenAndServe("tcp", cfg.ListenSocks); err != nil {
errChan <- fmt.Errorf("serve socks failed: %w", err)
}
errChan <- nil
}()
}

Expand All @@ -87,23 +85,25 @@ func (l *Launcher) launchClient(ctx context.Context, cfg *config.MixedConfig) er
h := http.New(ctx)
defer utils.Close(h)
go func() {
if err := h.ListenAndServe("tcp", cfg.ListenHttp); err != nil && !signalArrived {
if err := h.ListenAndServe("tcp", cfg.ListenHttp); err != nil {
errChan <- fmt.Errorf("serve http failed: %w", err)
}
errChan <- nil
}()
}

// blocks main
// listen interrupts
go func() {
l.waitForCancel()
signalArrived = true
l.listenSignal()
}()

// blocks main
select {
case err, ok := <-errChan:
if ok {
case err := <-errChan:
if err != nil {
return fmt.Errorf("inbound process error: %w", err)
}
case <-l.sigStop:
}
return nil
}
Expand Down
6 changes: 4 additions & 2 deletions api/stopper.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package api

import (
"log"
"os"
"os/signal"
"syscall"
)

func (l *Launcher) waitForCancel() {
func (l *Launcher) listenSignal() {
sys := make(chan os.Signal, 1)
signal.Notify(sys, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGINT)
select {
case <-sys:
case <-l.sigStop:
}
log.Println("signal arrived")
l.Stop()
}

func (l *Launcher) Stop() {
Expand Down

0 comments on commit eac0384

Please sign in to comment.