mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-21 09:28:14 +00:00
Merge branch 'main' of gitcode.com:JianFeeeee/HomeAgent
This commit is contained in:
@ -53,6 +53,9 @@ type Plugin struct {
|
||||
sdk *sdk.PluginSDK
|
||||
dispatcher *RegistryDispatcher
|
||||
httpClient *http.Client
|
||||
|
||||
stopCh chan struct{}
|
||||
stopOnce sync.Once
|
||||
}
|
||||
|
||||
// pluginSingleton 内核单例引用(Start 时设置),供 SendToChannel/ChannelSender 使用
|
||||
@ -65,6 +68,7 @@ func New(name, skillsDir string) *Plugin {
|
||||
}
|
||||
return &Plugin{
|
||||
name: name,
|
||||
stopCh: make(chan struct{}),
|
||||
skillsDir: skillsDir,
|
||||
simulatorDir: sd,
|
||||
dispatcher: NewDispatcher(),
|
||||
@ -300,10 +304,14 @@ func (p *Plugin) ipcGoroutine(s *sdk.PluginSDK) {
|
||||
ticker := time.NewTicker(3 * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
for range ticker.C {
|
||||
p.mu.Lock()
|
||||
simDir := p.simulatorDir
|
||||
p.mu.Unlock()
|
||||
for {
|
||||
select {
|
||||
case <-p.stopCh:
|
||||
return
|
||||
case <-ticker.C:
|
||||
p.mu.Lock()
|
||||
simDir := p.simulatorDir
|
||||
p.mu.Unlock()
|
||||
if simDir == "" {
|
||||
continue
|
||||
}
|
||||
@ -339,6 +347,7 @@ func (p *Plugin) ipcGoroutine(s *sdk.PluginSDK) {
|
||||
}
|
||||
os.Remove(reloadPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1247,6 +1256,10 @@ func (p *Plugin) loadSidecar(s *sdk.PluginSDK, dir, name string) error {
|
||||
func (p *Plugin) Stop() error {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
// 关停 ipcGoroutine(stopCh),避免重载后旧 goroutine 残留导致线程累积
|
||||
p.stopOnce.Do(func() {
|
||||
close(p.stopCh)
|
||||
})
|
||||
for _, sp := range p.sidecars {
|
||||
sp.Close()
|
||||
}
|
||||
|
||||
@ -49,8 +49,7 @@ type Plugin struct {
|
||||
selfToolNames map[string]bool
|
||||
checkMu sync.Mutex
|
||||
|
||||
stopCh chan struct{}
|
||||
stopOnce sync.Once
|
||||
stopCh chan struct{}
|
||||
perfData PerfData
|
||||
|
||||
autoInterval time.Duration
|
||||
@ -83,6 +82,15 @@ func New(name string) *Plugin {
|
||||
func (p *Plugin) Name() string { return p.name }
|
||||
|
||||
func (p *Plugin) Start(s *sdk.PluginSDK) error {
|
||||
// 幂等重启 auto-check:若实例被 Stop 过(stopCh 已关闭)后再次 Start
|
||||
// (如 plgreload 复用实例),重建 stopCh 使 startAutoCheck 能重新调度 ticker。
|
||||
p.mu.Lock()
|
||||
select {
|
||||
case <-p.stopCh:
|
||||
p.stopCh = make(chan struct{})
|
||||
default:
|
||||
}
|
||||
p.mu.Unlock()
|
||||
s.SetAutoRestart(true)
|
||||
p.autoInterval = 30 * time.Minute
|
||||
p.llmTimeout = 120 * time.Second
|
||||
@ -280,9 +288,14 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error {
|
||||
}
|
||||
|
||||
func (p *Plugin) Stop() error {
|
||||
p.stopOnce.Do(func() {
|
||||
// 幂等关闭:仅当 stopCh 未被关闭时 close。
|
||||
p.mu.Lock()
|
||||
select {
|
||||
case <-p.stopCh:
|
||||
default:
|
||||
close(p.stopCh)
|
||||
})
|
||||
}
|
||||
p.mu.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user