diff --git a/adapters/urltest.go b/adapters/urltest.go index 63aef470..7608024f 100644 --- a/adapters/urltest.go +++ b/adapters/urltest.go @@ -19,6 +19,7 @@ type URLTest struct { addr *C.Addr fast C.Proxy delay time.Duration + done chan struct{} } func (u *URLTest) Name() string { @@ -29,11 +30,21 @@ func (u *URLTest) Generator(addr *C.Addr) (adapter C.ProxyAdapter, err error) { return u.fast.Generator(addr) } +func (u *URLTest) Close() { + u.done <- struct{}{} +} + func (u *URLTest) loop() { - tick := time.Tick(u.delay) + tick := time.NewTicker(u.delay) go u.speedTest() - for range tick { - go u.speedTest() +Loop: + for { + select { + case <-tick.C: + go u.speedTest() + case <-u.done: + break Loop + } } } @@ -142,6 +153,7 @@ func NewURLTest(name string, proxys []C.Proxy, rawURL string, delay time.Duratio addr: addr, fast: proxys[0], delay: delay, + done: make(chan struct{}), } go urlTest.loop() return urlTest, nil diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index e2879101..8b7b696e 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -48,7 +48,7 @@ func (t *Tunnel) UpdateConfig() (err error) { return } - // clear proxys and rules + // empty proxys and rules proxys := make(map[string]C.Proxy) rules := []C.Rule{} @@ -78,10 +78,6 @@ func (t *Tunnel) UpdateConfig() (err error) { } } - // init proxy - proxys["DIRECT"] = adapters.NewDirect(t.traffic) - proxys["REJECT"] = adapters.NewReject() - // parse rules for _, key := range rulesConfig.Keys() { rule := strings.Split(key.Name(), ",") @@ -130,9 +126,21 @@ func (t *Tunnel) UpdateConfig() (err error) { } } + // init proxy + proxys["DIRECT"] = adapters.NewDirect(t.traffic) + proxys["REJECT"] = adapters.NewReject() + t.configLock.Lock() defer t.configLock.Unlock() + // stop url-test + for _, elm := range t.proxys { + urlTest, ok := elm.(*adapters.URLTest) + if ok { + urlTest.Close() + } + } + t.proxys = proxys t.rules = rules