fix: goroutine leak issue of cloudBlink

This commit is contained in:
Siyuan Miao 2025-09-12 10:02:02 +02:00
parent 8d1a66806c
commit 79c52f5ac7
3 changed files with 38 additions and 25 deletions

View File

@ -1,6 +1,7 @@
package kvm package kvm
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"os" "os"
@ -110,10 +111,14 @@ func clearDisplayState() {
currentScreen = "ui_Boot_Screen" currentScreen = "ui_Boot_Screen"
} }
const (
cloudBlinkInterval = 2 * time.Second
cloudBlinkDuration = 1 * time.Second
)
var ( var (
cloudBlinkLock sync.Mutex = sync.Mutex{}
cloudBlinkStopped bool
cloudBlinkTicker *time.Ticker cloudBlinkTicker *time.Ticker
cloudBlinkCancel context.CancelFunc
) )
func updateDisplay() { func updateDisplay() {
@ -160,40 +165,48 @@ func updateDisplay() {
} }
func startCloudBlink() { func startCloudBlink() {
// Stop any existing blink animation
stopCloudBlink()
// Create new ticker and context
if cloudBlinkTicker == nil { if cloudBlinkTicker == nil {
cloudBlinkTicker = time.NewTicker(2 * time.Second) cloudBlinkTicker = time.NewTicker(cloudBlinkInterval)
} else { } else {
// do nothing if the blink isn't stopped cloudBlinkTicker.Reset(cloudBlinkInterval)
if cloudBlinkStopped {
cloudBlinkLock.Lock()
defer cloudBlinkLock.Unlock()
cloudBlinkStopped = false
cloudBlinkTicker.Reset(2 * time.Second)
}
} }
go func() { ctx, cancel := context.WithCancel(context.Background())
for range cloudBlinkTicker.C { cloudBlinkCancel = cancel
go doCloudBlink(ctx)
}
func doCloudBlink(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
case <-cloudBlinkTicker.C:
if cloudConnectionState != CloudConnectionStateConnecting { if cloudConnectionState != CloudConnectionStateConnecting {
continue continue
} }
_, _ = lvObjFadeOut("ui_Home_Header_Cloud_Status_Icon", 1000) _, _ = lvObjFadeOut("ui_Home_Header_Cloud_Status_Icon", uint32(cloudBlinkDuration.Milliseconds()))
time.Sleep(1000 * time.Millisecond) time.Sleep(cloudBlinkDuration)
_, _ = lvObjFadeIn("ui_Home_Header_Cloud_Status_Icon", 1000) _, _ = lvObjFadeIn("ui_Home_Header_Cloud_Status_Icon", uint32(cloudBlinkDuration.Milliseconds()))
time.Sleep(1000 * time.Millisecond) time.Sleep(cloudBlinkDuration)
}
} }
}()
} }
func stopCloudBlink() { func stopCloudBlink() {
if cloudBlinkCancel != nil {
cloudBlinkCancel()
cloudBlinkCancel = nil
}
if cloudBlinkTicker != nil { if cloudBlinkTicker != nil {
cloudBlinkTicker.Stop() cloudBlinkTicker.Stop()
} }
cloudBlinkLock.Lock()
defer cloudBlinkLock.Unlock()
cloudBlinkStopped = true
} }
var ( var (

Binary file not shown.

View File

@ -1 +1 @@
6dabd0e657dd099280d9173069687786a4a8c9c25cf7f9e7ce2f940cab67c521 01db2bbcd0bad46c3e21eb3cc5687d15df2153c3d8e2d4665b37acb55f0b5a57