Release 2.6.2: disconnect AWG without freezing the UI.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Navis
2026-07-29 15:50:14 +03:00
co-authored by Cursor
parent 4ecfb9bed7
commit 6255a0d39b
22 changed files with 109 additions and 55 deletions
+20 -8
View File
@@ -100,21 +100,33 @@ func (m *Manager) Connect(ctx context.Context, profileName string) error {
func (m *Manager) Disconnect() error {
m.mu.Lock()
defer m.mu.Unlock()
sys := m.sys
engine := m.engine
m.engine = nil
m.profile = nil
m.mu.Unlock()
var first error
if m.sys.Enabled() {
if err := m.sys.Disable(); err != nil && first == nil {
if sys != nil && sys.Enabled() {
if err := sys.Disable(); err != nil && first == nil {
first = err
}
}
if m.engine != nil {
if err := m.engine.Stop(); err != nil && first == nil {
first = err
if engine != nil {
done := make(chan error, 1)
go func() { done <- engine.Stop() }()
select {
case err := <-done:
if err != nil && first == nil {
first = err
}
case <-time.After(3 * time.Second):
// Engine Stop can block on userspace relays; don't freeze the UI.
if first == nil {
first = fmt.Errorf("отключение заняло слишком много времени")
}
}
m.engine = nil
}
m.profile = nil
return first
}