|
@@ -25,6 +25,7 @@ package psi
|
|
|
// Start/Stop interface on top of a single Controller instance.
|
|
// Start/Stop interface on top of a single Controller instance.
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "context"
|
|
|
"encoding/json"
|
|
"encoding/json"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"sync"
|
|
"sync"
|
|
@@ -64,7 +65,8 @@ func NoticeUserLog(message string) {
|
|
|
|
|
|
|
|
var controllerMutex sync.Mutex
|
|
var controllerMutex sync.Mutex
|
|
|
var controller *psiphon.Controller
|
|
var controller *psiphon.Controller
|
|
|
-var shutdownBroadcast chan struct{}
|
|
|
|
|
|
|
+var controllerCtx context.Context
|
|
|
|
|
+var stopController context.CancelFunc
|
|
|
var controllerWaitGroup *sync.WaitGroup
|
|
var controllerWaitGroup *sync.WaitGroup
|
|
|
|
|
|
|
|
func Start(
|
|
func Start(
|
|
@@ -128,12 +130,13 @@ func Start(
|
|
|
return fmt.Errorf("error initializing controller: %s", err)
|
|
return fmt.Errorf("error initializing controller: %s", err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- shutdownBroadcast = make(chan struct{})
|
|
|
|
|
|
|
+ controllerCtx, stopController = context.WithCancel(context.Background())
|
|
|
|
|
+
|
|
|
controllerWaitGroup = new(sync.WaitGroup)
|
|
controllerWaitGroup = new(sync.WaitGroup)
|
|
|
controllerWaitGroup.Add(1)
|
|
controllerWaitGroup.Add(1)
|
|
|
go func() {
|
|
go func() {
|
|
|
defer controllerWaitGroup.Done()
|
|
defer controllerWaitGroup.Done()
|
|
|
- controller.Run(shutdownBroadcast)
|
|
|
|
|
|
|
+ controller.Run(controllerCtx)
|
|
|
}()
|
|
}()
|
|
|
|
|
|
|
|
return nil
|
|
return nil
|
|
@@ -145,10 +148,11 @@ func Stop() {
|
|
|
defer controllerMutex.Unlock()
|
|
defer controllerMutex.Unlock()
|
|
|
|
|
|
|
|
if controller != nil {
|
|
if controller != nil {
|
|
|
- close(shutdownBroadcast)
|
|
|
|
|
|
|
+ stopController()
|
|
|
controllerWaitGroup.Wait()
|
|
controllerWaitGroup.Wait()
|
|
|
controller = nil
|
|
controller = nil
|
|
|
- shutdownBroadcast = nil
|
|
|
|
|
|
|
+ controllerCtx = nil
|
|
|
|
|
+ stopController = nil
|
|
|
controllerWaitGroup = nil
|
|
controllerWaitGroup = nil
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|