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) close(s.done)
} }
var err error var err error
s.logger.Info("closing sing-box")
for _, closeItem := range []struct { for _, closeItem := range []struct {
name string name string
service adapter.Lifecycle service adapter.Lifecycle
@@ -552,6 +553,7 @@ func (s *Box) Close() error {
} }
err = errors.Join(err, closeErr) err = errors.Join(err, closeErr)
s.logger.Trace("close logger completed (", F.Seconds(time.Since(startTime).Seconds()), "s)") 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 return err
} }
-12
View File
@@ -2,7 +2,6 @@ package core
import ( import (
"context" "context"
"sync"
"github.com/alireza0/s-ui/logger" "github.com/alireza0/s-ui/logger"
@@ -29,7 +28,6 @@ var (
) )
type Core struct { type Core struct {
mu sync.RWMutex
isRunning bool isRunning bool
instance *Box instance *Box
} }
@@ -48,15 +46,10 @@ func (c *Core) GetCtx() context.Context {
} }
func (c *Core) GetInstance() *Box { func (c *Core) GetInstance() *Box {
c.mu.RLock()
defer c.mu.RUnlock()
return c.instance return c.instance
} }
func (c *Core) Start(sbConfig []byte) error { func (c *Core) Start(sbConfig []byte) error {
c.mu.Lock()
defer c.mu.Unlock()
var opt option.Options var opt option.Options
err := opt.UnmarshalJSONContext(globalCtx, sbConfig) err := opt.UnmarshalJSONContext(globalCtx, sbConfig)
if err != nil { if err != nil {
@@ -90,9 +83,6 @@ func (c *Core) Start(sbConfig []byte) error {
} }
func (c *Core) Stop() error { func (c *Core) Stop() error {
c.mu.Lock()
defer c.mu.Unlock()
c.isRunning = false c.isRunning = false
if c.instance == nil { if c.instance == nil {
return nil return nil
@@ -103,7 +93,5 @@ func (c *Core) Stop() error {
} }
func (c *Core) IsRunning() bool { func (c *Core) IsRunning() bool {
c.mu.RLock()
defer c.mu.RUnlock()
return c.isRunning return c.isRunning
} }
+14
View File
@@ -96,6 +96,7 @@ func (s *ConfigService) StartCore() error {
return nil return nil
} }
if time.Since(lastStartFailTime) < startCooldown { if time.Since(lastStartFailTime) < startCooldown {
logger.Info("start core cooldown ", startCooldown/time.Second, " seconds")
startCoreMu.Unlock() startCoreMu.Unlock()
return nil return nil
} }
@@ -133,6 +134,19 @@ func (s *ConfigService) RestartCore() error {
} }
func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) 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 corePtr.IsRunning() {
if err := corePtr.Stop(); err != nil { if err := corePtr.Stop(); err != nil {
logger.Error("restart sing-box err (stop):", err.Error()) logger.Error("restart sing-box err (stop):", err.Error())