mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2025-05-24 10:58:15 +08:00
chore: rebuild provider load
This commit is contained in:
parent
6e35cf9399
commit
23e2d3a132
@ -43,13 +43,14 @@ type HealthCheck struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (hc *HealthCheck) process() {
|
func (hc *HealthCheck) process() {
|
||||||
if hc.started.Load() {
|
if !hc.started.CompareAndSwap(false, true) {
|
||||||
log.Warnln("Skip start health check timer due to it's started")
|
log.Warnln("Skip start health check timer due to it's started")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer hc.started.Store(false)
|
||||||
|
|
||||||
ticker := time.NewTicker(hc.interval)
|
ticker := time.NewTicker(hc.interval)
|
||||||
hc.start()
|
go hc.check()
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
@ -62,7 +63,6 @@ func (hc *HealthCheck) process() {
|
|||||||
}
|
}
|
||||||
case <-hc.ctx.Done():
|
case <-hc.ctx.Done():
|
||||||
ticker.Stop()
|
ticker.Stop()
|
||||||
hc.stop()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,14 +131,6 @@ func (hc *HealthCheck) touch() {
|
|||||||
hc.lastTouch.Store(time.Now())
|
hc.lastTouch.Store(time.Now())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hc *HealthCheck) start() {
|
|
||||||
hc.started.Store(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (hc *HealthCheck) stop() {
|
|
||||||
hc.started.Store(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (hc *HealthCheck) check() {
|
func (hc *HealthCheck) check() {
|
||||||
if len(hc.proxies) == 0 {
|
if len(hc.proxies) == 0 {
|
||||||
return
|
return
|
||||||
|
@ -302,9 +302,6 @@ func (cp *compatibleProvider) Update() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cp *compatibleProvider) Initial() error {
|
func (cp *compatibleProvider) Initial() error {
|
||||||
if cp.healthCheck.interval != 0 && cp.healthCheck.url != "" {
|
|
||||||
cp.HealthCheck()
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,12 +113,11 @@ func ApplyConfig(cfg *config.Config, force bool) {
|
|||||||
tunnel.OnInnerLoading()
|
tunnel.OnInnerLoading()
|
||||||
|
|
||||||
initInnerTcp()
|
initInnerTcp()
|
||||||
loadProxyProvider(cfg.Providers)
|
loadProvider(cfg.Providers)
|
||||||
updateProfile(cfg)
|
updateProfile(cfg)
|
||||||
loadRuleProvider(cfg.RuleProviders)
|
loadProvider(cfg.RuleProviders)
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
tunnel.OnRunning()
|
tunnel.OnRunning()
|
||||||
hcCompatibleProvider(cfg.Providers)
|
|
||||||
updateUpdater(cfg)
|
updateUpdater(cfg)
|
||||||
|
|
||||||
resolver.ResetConnection()
|
resolver.ResetConnection()
|
||||||
@ -303,79 +302,40 @@ func updateRules(rules []C.Rule, subRules map[string][]C.Rule, ruleProviders map
|
|||||||
tunnel.UpdateRules(rules, subRules, ruleProviders)
|
tunnel.UpdateRules(rules, subRules, ruleProviders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadProvider(pv provider.Provider) {
|
func loadProvider[P provider.Provider](providers map[string]P) {
|
||||||
if pv.VehicleType() == provider.Compatible {
|
load := func(pv P) {
|
||||||
return
|
name := pv.Name()
|
||||||
} else {
|
if pv.VehicleType() == provider.Compatible {
|
||||||
log.Infoln("Start initial provider %s", (pv).Name())
|
log.Infoln("Start initial compatible provider %s", name)
|
||||||
}
|
} else {
|
||||||
|
log.Infoln("Start initial provider %s", name)
|
||||||
if err := pv.Initial(); err != nil {
|
|
||||||
switch pv.Type() {
|
|
||||||
case provider.Proxy:
|
|
||||||
{
|
|
||||||
log.Errorln("initial proxy provider %s error: %v", (pv).Name(), err)
|
|
||||||
}
|
|
||||||
case provider.Rule:
|
|
||||||
{
|
|
||||||
log.Errorln("initial rule provider %s error: %v", (pv).Name(), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadRuleProvider(ruleProviders map[string]provider.RuleProvider) {
|
if err := pv.Initial(); err != nil {
|
||||||
wg := sync.WaitGroup{}
|
switch pv.Type() {
|
||||||
ch := make(chan struct{}, concurrentCount)
|
case provider.Proxy:
|
||||||
for _, ruleProvider := range ruleProviders {
|
{
|
||||||
ruleProvider := ruleProvider
|
log.Errorln("initial proxy provider %s error: %v", name, err)
|
||||||
wg.Add(1)
|
|
||||||
ch <- struct{}{}
|
|
||||||
go func() {
|
|
||||||
defer func() { <-ch; wg.Done() }()
|
|
||||||
loadProvider(ruleProvider)
|
|
||||||
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadProxyProvider(proxyProviders map[string]provider.ProxyProvider) {
|
|
||||||
// limit concurrent size
|
|
||||||
wg := sync.WaitGroup{}
|
|
||||||
ch := make(chan struct{}, concurrentCount)
|
|
||||||
for _, proxyProvider := range proxyProviders {
|
|
||||||
proxyProvider := proxyProvider
|
|
||||||
wg.Add(1)
|
|
||||||
ch <- struct{}{}
|
|
||||||
go func() {
|
|
||||||
defer func() { <-ch; wg.Done() }()
|
|
||||||
loadProvider(proxyProvider)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
wg.Wait()
|
|
||||||
}
|
|
||||||
func hcCompatibleProvider(proxyProviders map[string]provider.ProxyProvider) {
|
|
||||||
// limit concurrent size
|
|
||||||
wg := sync.WaitGroup{}
|
|
||||||
ch := make(chan struct{}, concurrentCount)
|
|
||||||
for _, proxyProvider := range proxyProviders {
|
|
||||||
proxyProvider := proxyProvider
|
|
||||||
if proxyProvider.VehicleType() == provider.Compatible {
|
|
||||||
log.Infoln("Start initial Compatible provider %s", proxyProvider.Name())
|
|
||||||
wg.Add(1)
|
|
||||||
ch <- struct{}{}
|
|
||||||
go func() {
|
|
||||||
defer func() { <-ch; wg.Done() }()
|
|
||||||
if err := proxyProvider.Initial(); err != nil {
|
|
||||||
log.Errorln("initial Compatible provider %s error: %v", proxyProvider.Name(), err)
|
|
||||||
}
|
}
|
||||||
}()
|
case provider.Rule:
|
||||||
|
{
|
||||||
|
log.Errorln("initial rule provider %s error: %v", name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
ch := make(chan struct{}, concurrentCount)
|
||||||
|
for _, pv := range providers {
|
||||||
|
pv := pv
|
||||||
|
wg.Add(1)
|
||||||
|
ch <- struct{}{}
|
||||||
|
go func() {
|
||||||
|
defer func() { <-ch; wg.Done() }()
|
||||||
|
load(pv)
|
||||||
|
}()
|
||||||
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user