in gradle-plugins/preview-rpc/src/main/kotlin/org/jetbrains/compose/desktop/ui/tooling/preview/rpc/PreviewManager.kt [186:225]
override fun close() {
if (!isAlive.compareAndSet(true, false)) return
closeService("PREVIEW MANAGER") {
val runningPreview = runningPreview.getAndSet(null)
val previewConnection = runningPreview?.connection
val previewProcess = runningPreview?.process
threads.forEach { it.interrupt() }
closeService("PREVIEW HOST CONNECTION") { previewConnection?.close() }
closeService("PREVIEW SOCKET") { previewSocket.close() }
closeService("GRADLE SOCKET") { gradleCallbackSocket.close() }
closeService("THREADS") {
for (i in 0..3) {
var aliveThreads = 0
for (t in threads) {
if (t.isAlive) {
aliveThreads++
t.interrupt()
}
}
if (aliveThreads == 0) break
else Thread.sleep(300)
}
val aliveThreads = threads.filter { it.isAlive }
if (aliveThreads.isNotEmpty()) {
error("Could not stop threads: ${aliveThreads.joinToString(", ") { it.name }}")
}
}
closeService("PREVIEW HOST PROCESS") {
previewProcess?.let { process ->
if (!process.waitFor(5, TimeUnit.SECONDS)) {
log { "FORCIBLY DESTROYING PREVIEW HOST PROCESS" }
// todo: check exit code
process.destroyForcibly()
}
}
}
}
}