Merge branch 'main' of gitcode.com:JianFeeeee/HomeAgent

This commit is contained in:
2026-08-17 09:34:42 +08:00
9 changed files with 232 additions and 11 deletions

View File

@ -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()
// 关停 ipcGoroutinestopCh避免重载后旧 goroutine 残留导致线程累积
p.stopOnce.Do(func() {
close(p.stopCh)
})
for _, sp := range p.sidecars {
sp.Close()
}

View File

@ -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
}