fix reset core conflict

This commit is contained in:
Alireza Ahmadi
2026-03-11 23:48:54 +01:00
parent 51cf30f429
commit 1ef0ffa60e
3 changed files with 16 additions and 12 deletions
+2
View File
@@ -489,6 +489,7 @@ func (s *Box) Close() error {
close(s.done)
}
var err error
s.logger.Info("closing sing-box")
for _, closeItem := range []struct {
name string
service adapter.Lifecycle
@@ -552,6 +553,7 @@ func (s *Box) Close() error {
}
err = errors.Join(err, closeErr)
s.logger.Trace("close logger completed (", F.Seconds(time.Since(startTime).Seconds()), "s)")
s.logger.Info("sing-box closed (live time: ", F.Seconds(time.Since(s.createdAt).Seconds()), "s)")
return err
}
-12
View File
@@ -2,7 +2,6 @@ package core
import (
"context"
"sync"
"github.com/alireza0/s-ui/logger"
@@ -29,7 +28,6 @@ var (
)
type Core struct {
mu sync.RWMutex
isRunning bool
instance *Box
}
@@ -48,15 +46,10 @@ func (c *Core) GetCtx() context.Context {
}
func (c *Core) GetInstance() *Box {
c.mu.RLock()
defer c.mu.RUnlock()
return c.instance
}
func (c *Core) Start(sbConfig []byte) error {
c.mu.Lock()
defer c.mu.Unlock()
var opt option.Options
err := opt.UnmarshalJSONContext(globalCtx, sbConfig)
if err != nil {
@@ -90,9 +83,6 @@ func (c *Core) Start(sbConfig []byte) error {
}
func (c *Core) Stop() error {
c.mu.Lock()
defer c.mu.Unlock()
c.isRunning = false
if c.instance == nil {
return nil
@@ -103,7 +93,5 @@ func (c *Core) Stop() error {
}
func (c *Core) IsRunning() bool {
c.mu.RLock()
defer c.mu.RUnlock()
return c.isRunning
}
+14
View File
@@ -96,6 +96,7 @@ func (s *ConfigService) StartCore() error {
return nil
}
if time.Since(lastStartFailTime) < startCooldown {
logger.Info("start core cooldown ", startCooldown/time.Second, " seconds")
startCoreMu.Unlock()
return nil
}
@@ -133,6 +134,19 @@ func (s *ConfigService) RestartCore() error {
}
func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error {
startCoreMu.Lock()
if startCoreInProgress {
startCoreMu.Unlock()
return nil
}
startCoreInProgress = true
startCoreMu.Unlock()
defer func() {
startCoreMu.Lock()
startCoreInProgress = false
startCoreMu.Unlock()
}()
if corePtr.IsRunning() {
if err := corePtr.Stop(); err != nil {
logger.Error("restart sing-box err (stop):", err.Error())