override fun close()

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()
                    }
                }
            }
        }
    }