Waits properly for all subprocess to exit
This commit is contained in:
@@ -110,9 +110,7 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait
|
|||||||
waitError := make(chan error)
|
waitError := make(chan error)
|
||||||
go func() {
|
go func() {
|
||||||
err := waitFn() // blocking
|
err := waitFn() // blocking
|
||||||
if unboundCtx.Err() != context.Canceled {
|
|
||||||
waitError <- err
|
waitError <- err
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Wait for one of the three cases below
|
// 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():
|
case <-ctx.Done():
|
||||||
l.logger.Warn("context canceled: exiting loop")
|
l.logger.Warn("context canceled: exiting loop")
|
||||||
unboundCancel()
|
unboundCancel()
|
||||||
|
<-waitError
|
||||||
close(waitError)
|
close(waitError)
|
||||||
return
|
return
|
||||||
case <-restart: // triggered restart
|
case <-restart: // triggered restart
|
||||||
|
|||||||
@@ -62,14 +62,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait
|
|||||||
waitError := make(chan error)
|
waitError := make(chan error)
|
||||||
go func() {
|
go func() {
|
||||||
err := waitFn() // blocking
|
err := waitFn() // blocking
|
||||||
if openvpnCtx.Err() != context.Canceled {
|
|
||||||
waitError <- err
|
waitError <- err
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
l.logger.Warn("context canceled: exiting loop")
|
l.logger.Warn("context canceled: exiting loop")
|
||||||
openvpnCancel()
|
openvpnCancel()
|
||||||
|
<-waitError
|
||||||
close(waitError)
|
close(waitError)
|
||||||
return
|
return
|
||||||
case <-restart: // triggered restart
|
case <-restart: // triggered restart
|
||||||
|
|||||||
@@ -90,14 +90,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait
|
|||||||
waitError := make(chan error)
|
waitError := make(chan error)
|
||||||
go func() {
|
go func() {
|
||||||
err := waitFn() // blocking
|
err := waitFn() // blocking
|
||||||
if shadowsocksCtx.Err() != context.Canceled {
|
|
||||||
waitError <- err
|
waitError <- err
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
l.logger.Warn("context canceled: exiting loop")
|
l.logger.Warn("context canceled: exiting loop")
|
||||||
shadowsocksCancel()
|
shadowsocksCancel()
|
||||||
|
<-waitError
|
||||||
close(waitError)
|
close(waitError)
|
||||||
return
|
return
|
||||||
case <-restart: // triggered restart
|
case <-restart: // triggered restart
|
||||||
|
|||||||
@@ -82,14 +82,13 @@ func (l *looper) Run(ctx context.Context, restart <-chan struct{}, wg *sync.Wait
|
|||||||
waitError := make(chan error)
|
waitError := make(chan error)
|
||||||
go func() {
|
go func() {
|
||||||
err := waitFn() // blocking
|
err := waitFn() // blocking
|
||||||
if tinyproxyCtx.Err() != context.Canceled {
|
|
||||||
waitError <- err
|
waitError <- err
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
l.logger.Warn("context canceled: exiting loop")
|
l.logger.Warn("context canceled: exiting loop")
|
||||||
tinyproxyCancel()
|
tinyproxyCancel()
|
||||||
|
<-waitError
|
||||||
close(waitError)
|
close(waitError)
|
||||||
return
|
return
|
||||||
case <-restart: // triggered restart
|
case <-restart: // triggered restart
|
||||||
|
|||||||
Reference in New Issue
Block a user