Release 2.6.2: disconnect AWG without freezing the UI.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user