Skip to content

Commit 5f60bae

Browse files
committed
Solve the problem of memory leaks
Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
1 parent 88805af commit 5f60bae

File tree

9 files changed

+122
-34
lines changed

9 files changed

+122
-34
lines changed

jsonrpc.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,17 @@ func rpcSetDevChannelState(enabled bool) error {
266266
return nil
267267
}
268268

269+
func rpcGetLocalUpdateStatus() (*LocalMetadata, error) {
270+
var localStatus LocalMetadata
271+
systemVersionLocal, appVersionLocal, err := GetLocalVersion()
272+
if err != nil {
273+
return nil, fmt.Errorf("failed to get local version: %w", err)
274+
}
275+
localStatus.AppVersion = appVersionLocal.String()
276+
localStatus.SystemVersion = systemVersionLocal.String()
277+
return &localStatus, nil
278+
}
279+
269280
func rpcGetUpdateStatus() (*UpdateStatus, error) {
270281
includePreRelease := config.IncludePreRelease
271282
updateStatus, err := GetUpdateStatus(context.Background(), GetDeviceID(), includePreRelease)
@@ -1004,6 +1015,7 @@ var rpcHandlers = map[string]RPCHandler{
10041015
"setEDID": {Func: rpcSetEDID, Params: []string{"edid"}},
10051016
"getDevChannelState": {Func: rpcGetDevChannelState},
10061017
"setDevChannelState": {Func: rpcSetDevChannelState, Params: []string{"enabled"}},
1018+
"getLocalUpdateStatus": {Func: rpcGetLocalUpdateStatus},
10071019
"getUpdateStatus": {Func: rpcGetUpdateStatus},
10081020
"tryUpdate": {Func: rpcTryUpdate},
10091021
"getDevModeState": {Func: rpcGetDevModeState},

ota.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,8 @@ func fetchUpdateMetadata(ctx context.Context, deviceId string, includePreRelease
8989
//if err != nil {
9090
// return nil, fmt.Errorf("failed to fetch GitHub releases: %w", err)
9191
//}
92+
//_ = cmd.Process.Release()
9293

93-
//var release struct {
94-
// TagName string `json:"tag_name"`
95-
// Assets []struct {
96-
// BrowserDownloadURL string `json:"browser_download_url"`
97-
// Digest string `json:"digest"`
98-
// } `json:"assets"`
99-
//}
100-
//if err := json.Unmarshal(output, &release); err != nil {
101-
// return nil, fmt.Errorf("failed to parse GitHub releases JSON: %w", err)
102-
//}
10394
resp, err := http.Get(UpdateMetadataUrl)
10495
if err != nil {
10596
return nil, fmt.Errorf("failed to fetch GitHub releases: %w", err)

serial.go

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,69 @@ func initSerialPort() {
2222
_ = reopenSerialPort()
2323
}
2424

25+
//func reopenSerialPort() error {
26+
// if port != nil {
27+
// port.Close()
28+
// }
29+
// var err error
30+
// port, err = serial.Open(serialPortPath, defaultMode)
31+
// if err != nil {
32+
// serialLogger.Error().
33+
// Err(err).
34+
// Str("path", serialPortPath).
35+
// Interface("mode", defaultMode).
36+
// Msg("Error opening serial port")
37+
// }
38+
// return nil
39+
//}
40+
//
41+
//func handleSerialChannel(d *webrtc.DataChannel) {
42+
// scopedLogger := serialLogger.With().
43+
// Uint16("data_channel_id", *d.ID()).Logger()
44+
//
45+
// d.OnOpen(func() {
46+
// go func() {
47+
// buf := make([]byte, 1024)
48+
// for {
49+
// n, err := port.Read(buf)
50+
// if err != nil {
51+
// if err != io.EOF {
52+
// scopedLogger.Warn().Err(err).Msg("Failed to read from serial port")
53+
// }
54+
// break
55+
// }
56+
// err = d.Send(buf[:n])
57+
// if err != nil {
58+
// scopedLogger.Warn().Err(err).Msg("Failed to send serial output")
59+
// break
60+
// }
61+
// }
62+
// }()
63+
// })
64+
//
65+
// d.OnMessage(func(msg webrtc.DataChannelMessage) {
66+
// if port == nil {
67+
// return
68+
// }
69+
// _, err := port.Write(msg.Data)
70+
// if err != nil {
71+
// scopedLogger.Warn().Err(err).Msg("Failed to write to serial")
72+
// }
73+
// })
74+
//
75+
// d.OnError(func(err error) {
76+
// scopedLogger.Warn().Err(err).Msg("Serial channel error")
77+
// })
78+
//
79+
// d.OnClose(func() {
80+
// scopedLogger.Info().Msg("Serial channel closed")
81+
// })
82+
//}
83+
2584
func reopenSerialPort() error {
2685
if port != nil {
2786
port.Close()
87+
port = nil
2888
}
2989
var err error
3090
port, err = serial.Open(serialPortPath, defaultMode)
@@ -34,7 +94,12 @@ func reopenSerialPort() error {
3494
Str("path", serialPortPath).
3595
Interface("mode", defaultMode).
3696
Msg("Error opening serial port")
97+
return err
3798
}
99+
serialLogger.Info().
100+
Str("path", serialPortPath).
101+
Interface("mode", defaultMode).
102+
Msg("Serial port opened successfully")
38103
return nil
39104
}
40105

@@ -43,6 +108,14 @@ func handleSerialChannel(d *webrtc.DataChannel) {
43108
Uint16("data_channel_id", *d.ID()).Logger()
44109

45110
d.OnOpen(func() {
111+
// 打开串口
112+
if err := reopenSerialPort(); err != nil {
113+
scopedLogger.Error().Err(err).Msg("Failed to open serial port")
114+
d.Close()
115+
return
116+
}
117+
118+
// 串口读取协程
46119
go func() {
47120
buf := make([]byte, 1024)
48121
for {
@@ -53,8 +126,7 @@ func handleSerialChannel(d *webrtc.DataChannel) {
53126
}
54127
break
55128
}
56-
err = d.Send(buf[:n])
57-
if err != nil {
129+
if err := d.Send(buf[:n]); err != nil {
58130
scopedLogger.Warn().Err(err).Msg("Failed to send serial output")
59131
break
60132
}
@@ -77,6 +149,10 @@ func handleSerialChannel(d *webrtc.DataChannel) {
77149
})
78150

79151
d.OnClose(func() {
152+
if port != nil {
153+
port.Close()
154+
port = nil
155+
}
80156
scopedLogger.Info().Msg("Serial channel closed")
81157
})
82158
}

ui/src/components/Terminal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const SOLARIZED_THEME = {
3030
cyan: "#2aa198", // Solarized cyan
3131
white: "#eee8d5", // Solarized base2
3232
brightBlack: "#002b36", // Solarized base03
33-
brightRed: "#cb4b16", // Solarized blue
33+
brightRed: "#cb4b16", // Solarized orange
3434
brightGreen: "#586e75", // Solarized base01
3535
brightYellow: "#657b83", // Solarized base00
3636
brightBlue: "#839496", // Solarized base0

ui/src/routes/devices.$id.settings.general.update.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ export interface SystemVersionInfo {
5656
error?: string;
5757
}
5858

59+
export interface LocalVersionInfo {
60+
appVersion: string;
61+
systemVersion: string;
62+
}
63+
64+
5965
export function Dialog({
6066
onClose,
6167
onConfirmUpdate,

ui/src/routes/devices.$id.tsx

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import { FeatureFlagProvider } from "../providers/FeatureFlagProvider";
5454
import notifications from "../notifications";
5555

5656
import { DeviceStatus } from "./welcome-local";
57-
import { SystemVersionInfo } from "./devices.$id.settings.general.update";
57+
import { SystemVersionInfo, LocalVersionInfo } from "./devices.$id.settings.general.update";
5858

5959
import { useVpnStore } from "@/hooks/stores";
6060

@@ -551,7 +551,7 @@ export default function KvmIdRoute() {
551551
}
552552
}
553553

554-
useInterval(updateVpnStates, 5000);
554+
//useInterval(updateVpnStates, 5000);
555555

556556
const setNetworkState = useNetworkStateStore(state => state.setNetworkState);
557557

@@ -686,14 +686,20 @@ export default function KvmIdRoute() {
686686

687687
useEffect(() => {
688688
if (!peerConnection) return;
689-
if (!kvmTerminal) {
690-
setKvmTerminal(peerConnection.createDataChannel("terminal"));
691-
}
692-
693-
if (!serialConsole) {
694-
setSerialConsole(peerConnection.createDataChannel("serial"));
695-
}
696-
}, [kvmTerminal, peerConnection, serialConsole]);
689+
//if (!kvmTerminal) {
690+
// setKvmTerminal(peerConnection.createDataChannel("terminal"));
691+
//}
692+
693+
//if (!serialConsole) {
694+
// setSerialConsole(peerConnection.createDataChannel("serial"));
695+
//}
696+
const terminalChannel = peerConnection.createDataChannel("terminal");
697+
setKvmTerminal(terminalChannel);
698+
const serialChannel = peerConnection.createDataChannel("serial");
699+
setSerialConsole(serialChannel);
700+
701+
//}, [kvmTerminal, peerConnection, serialConsole]);
702+
}, [peerConnection]);
697703

698704
const outlet = useOutlet();
699705
const onModalClose = useCallback(() => {
@@ -707,19 +713,15 @@ export default function KvmIdRoute() {
707713
useEffect(() => {
708714
if (appVersion) return;
709715

710-
send("getUpdateStatus", {}, async resp => {
716+
send("getLocalUpdateStatus", {}, async resp => {
711717
if ("error" in resp) {
712718
notifications.error(`Failed to get device version: ${resp.error}`);
713719
return
714720
}
715721

716-
const result = resp.result as SystemVersionInfo;
717-
if (result.error) {
718-
notifications.error(`Failed to get device version: ${result.error}`);
719-
}
720-
721-
setAppVersion(result.local.appVersion);
722-
setSystemVersion(result.local.systemVersion);
722+
const result = resp.result as LocalVersionInfo;
723+
setAppVersion(result.appVersion);
724+
setSystemVersion(result.systemVersion);
723725
});
724726
}, [appVersion, send, setAppVersion, setSystemVersion]);
725727

vpn.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ func rpcLoginTailScale(xEdge bool) (TailScaleSettings, error) {
203203
}
204204

205205
if currentState == TailScaleDisconnected || currentState == TailScaleConnecting {
206-
fmt.Printf("[rpcLoginTailScale] currentState2: %v\n", currentState)
207206
if xEdge {
208207
cmd := exec.Command("tailscale", "up", "--login-server", "https://login.xedge.cc")
209208
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}

web.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ func setupRouter() *gin.Engine {
7777
))
7878
staticFS, _ := fs.Sub(staticFiles, "static")
7979

80+
r.Any("/debug/pprof/*any", gin.WrapH(http.DefaultServeMux))
81+
8082
// Add a custom middleware to set cache headers for images
8183
// This is crucial for optimizing the initial welcome screen load time
8284
// By enabling caching, we ensure that pre-loaded images are stored in the browser cache

webrtc.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ func newSession(config SessionConfig) (*Session, error) {
104104
case "disk":
105105
session.DiskChannel = d
106106
d.OnMessage(onDiskMessage)
107-
//case "terminal":
108-
// handleTerminalChannel(d)
107+
case "terminal":
108+
handleTerminalChannel(d)
109109
case "serial":
110110
handleSerialChannel(d)
111111
default:

0 commit comments

Comments
 (0)