From 0681272078a8e031c64e22a061fb776762c07532 Mon Sep 17 00:00:00 2001 From: PJ Date: Sat, 25 Apr 2026 15:55:08 +0700 Subject: [PATCH] fix(sidecar): serialize WDA reconnect with ReentrantLock to prevent concurrent xcodebuild races --- .../kotlin/dev/sanderling/sidecar/DriverBackend.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt index 6525d53..c3c6762 100644 --- a/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt +++ b/sidecar/src/main/kotlin/dev/sanderling/sidecar/DriverBackend.kt @@ -488,6 +488,7 @@ private fun pngHeight(bytes: ByteArray): Int { class IosDriverBackend(private val udid: String) : DriverBackend { private lateinit var driver: maestro.drivers.IOSDriver + private val reconnectLock = java.util.concurrent.locks.ReentrantLock() init { val httpClient = xcuitest.api.OkHttpClientInstance.get() @@ -534,9 +535,14 @@ class IosDriverBackend(private val udid: String) : DriverBackend { val isIoFailure = generateSequence(e as Throwable) { it.cause } .any { it is java.io.IOException } if (!isIoFailure) throw e - try { driver.open(); warmup() } - catch (reconnectErr: Exception) { - throw IllegalStateException("WDA reconnect failed: $reconnectErr", e) + reconnectLock.lock() + try { + try { driver.open(); warmup() } + catch (reconnectErr: Exception) { + throw IllegalStateException("WDA reconnect failed: $reconnectErr", e) + } + } finally { + reconnectLock.unlock() } block() }