diff --git a/internal/dns/loop.go b/internal/dns/loop.go index d8301cf1..eae0ac7c 100644 --- a/internal/dns/loop.go +++ b/internal/dns/loop.go @@ -110,9 +110,7 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait waitError := make(chan error) go func() { err := waitFn() // blocking - if unboundCtx.Err() != context.Canceled { - waitError <- err - } + waitError <- err }() // Wait for one of the three cases below @@ -120,6 +118,7 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait case <-ctx.Done(): l.logger.Warn("context canceled: exiting loop") unboundCancel() + <-waitError close(waitError) return case <-restart: // triggered restart diff --git a/internal/openvpn/loop.go b/internal/openvpn/loop.go index f83e48be..753a5134 100644 --- a/internal/openvpn/loop.go +++ b/internal/openvpn/loop.go @@ -62,14 +62,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait waitError := make(chan error) go func() { err := waitFn() // blocking - if openvpnCtx.Err() != context.Canceled { - waitError <- err - } + waitError <- err }() select { case <-ctx.Done(): l.logger.Warn("context canceled: exiting loop") openvpnCancel() + <-waitError close(waitError) return case <-restart: // triggered restart diff --git a/internal/shadowsocks/loop.go b/internal/shadowsocks/loop.go index d4981755..05e8fcde 100644 --- a/internal/shadowsocks/loop.go +++ b/internal/shadowsocks/loop.go @@ -90,14 +90,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait waitError := make(chan error) go func() { err := waitFn() // blocking - if shadowsocksCtx.Err() != context.Canceled { - waitError <- err - } + waitError <- err }() select { case <-ctx.Done(): l.logger.Warn("context canceled: exiting loop") shadowsocksCancel() + <-waitError close(waitError) return case <-restart: // triggered restart diff --git a/internal/tinyproxy/loop.go b/internal/tinyproxy/loop.go index 46b875c8..b44e37ec 100644 --- a/internal/tinyproxy/loop.go +++ b/internal/tinyproxy/loop.go @@ -82,14 +82,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait waitError := make(chan error) go func() { err := waitFn() // blocking - if tinyproxyCtx.Err() != context.Canceled { - waitError <- err - } + waitError <- err }() select { case <-ctx.Done(): l.logger.Warn("context canceled: exiting loop") tinyproxyCancel() + <-waitError close(waitError) return case <-restart: // triggered restart