Reuse open remote server for JIT bounce-back to avoid cold-launch race

This commit is contained in:
CelloSerenity 2026-07-26 11:38:58 -06:00
parent 83da8aad29
commit 60accbe1d1
2 changed files with 33 additions and 13 deletions

View file

@ -645,18 +645,7 @@ final class JITEnableContext {
func relaunchApp(_ bundleID: String, logger: LogFunc? = nil) -> Bool {
do {
let pid = try withConnectedRemoteServer { remoteServer in
try withProcessControl(remoteServer: remoteServer) { processControl in
var pid: UInt64 = 0
let ffiError = bundleID.withCString { bundleID in
process_control_launch_app(processControl, bundleID, nil, 0, nil, 0, false, false, &pid)
}
if let ffiError {
throw error(from: ffiError, fallback: "Failed to return to app")
}
return pid
}
try relaunchApp(bundleID, remoteServer: remoteServer)
}
emitLog("Returned to \(bundleID) (PID \(pid))", logger: logger)
@ -667,6 +656,32 @@ final class JITEnableContext {
}
}
func relaunchApp(_ bundleID: String, usingRemoteServer remoteServer: OpaquePointer, logger: LogFunc? = nil) -> Bool {
do {
let pid = try relaunchApp(bundleID, remoteServer: remoteServer)
emitLog("Returned to \(bundleID) (PID \(pid))", logger: logger)
return true
} catch {
emitLog("Failed to return to \(bundleID): \(error.localizedDescription)", logger: logger)
return false
}
}
private func relaunchApp(_ bundleID: String, remoteServer: OpaquePointer) throws -> UInt64 {
try withProcessControl(remoteServer: remoteServer) { processControl in
var pid: UInt64 = 0
let ffiError = bundleID.withCString { bundleID in
process_control_launch_app(processControl, bundleID, nil, 0, nil, 0, false, false, &pid)
}
if let ffiError {
throw error(from: ffiError, fallback: "Failed to return to app")
}
return pid
}
}
func startSyslogRelay(handler: @escaping SyslogLineHandler, onError: @escaping SyslogErrorHandler) {
do {
try ensureTunnel()

View file

@ -132,7 +132,12 @@ final class RunJSViewModel: ObservableObject, Identifiable, @unchecked Sendable
resumeLock.unlock()
appendLog("Returning to \(resumeBundleID)...")
let success = JITEnableContext.shared.relaunchApp(resumeBundleID)
let success: Bool
if let remoteServer {
success = JITEnableContext.shared.relaunchApp(resumeBundleID, usingRemoteServer: remoteServer)
} else {
success = JITEnableContext.shared.relaunchApp(resumeBundleID)
}
guard success else {
appendLog("Failed to return to \(resumeBundleID) — continuing in the foreground.")
return "failed to return to \(resumeBundleID)"