diff --git a/core/box.go b/core/box.go index e682fc6..172ca11 100644 --- a/core/box.go +++ b/core/box.go @@ -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 } diff --git a/core/main.go b/core/main.go index bbdf4e5..e43eb94 100644 --- a/core/main.go +++ b/core/main.go @@ -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 } diff --git a/service/config.go b/service/config.go index d2a130c..91ec07d 100644 --- a/service/config.go +++ b/service/config.go @@ -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())