From 15bbce4e28df8688ccf80d5f44ebaa167409facc Mon Sep 17 00:00:00 2001 From: Travis Wyatt Date: Fri, 14 Jan 2022 01:26:44 -0800 Subject: [PATCH] Fix freeze crash on Apple --- core/build.gradle.kts | 1 + core/src/commonMain/kotlin/Observation.kt | 9 +++++++-- gradle/libs.versions.toml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 400628b67..0e0d81db7 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -35,6 +35,7 @@ kotlin { api(libs.kotlinx.coroutines.core) api(libs.uuid) implementation(libs.tuulbox.collections) + implementation(libs.stately.collections) } } diff --git a/core/src/commonMain/kotlin/Observation.kt b/core/src/commonMain/kotlin/Observation.kt index f9b9eb74e..039001a89 100644 --- a/core/src/commonMain/kotlin/Observation.kt +++ b/core/src/commonMain/kotlin/Observation.kt @@ -1,8 +1,10 @@ package com.juul.kable +import co.touchlab.stately.collections.IsoMutableList import com.juul.kable.State.Connecting.Observes import com.juul.kable.logs.Logger import com.juul.kable.logs.Logging +import kotlinx.atomicfu.atomic import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -23,9 +25,12 @@ internal class Observation( private val logger = Logger(logging, tag = "Kable/Observation", identifier) private val mutex = Mutex() - private val subscribers = mutableListOf() + private val subscribers = IsoMutableList() - private var didStartObservation = false + private val _didStartObservation = atomic(false) + private var didStartObservation: Boolean + get() = _didStartObservation.value + set(value) { _didStartObservation.value = value } private val isConnected: Boolean get() = state.value.isAtLeast() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b6a634fa..7642f1326 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ kotlin-extensions = { module = "org.jetbrains.kotlin-wrappers:kotlin-extensions" kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } -stately = { module = "co.touchlab:stately-isolate", version = "1.2.1" } +stately-collections = { module = "co.touchlab:stately-iso-collections", version = "1.2.1" } tuulbox-logging = { module = "com.juul.tuulbox:logging", version.ref = "tuulbox" } tuulbox-collections = { module = "com.juul.tuulbox:collections", version.ref = "tuulbox" } uuid = { module = "com.benasher44:uuid", version = "0.3.1" }