From 62beff32801c216da672a039b178eb774de25d81 Mon Sep 17 00:00:00 2001 From: Melad Raouf Date: Tue, 17 Jun 2025 11:12:44 +0300 Subject: [PATCH] [MS-1030] Ensure thread-safe initialization of Realm instance in getRealm method --- .../enrolment/records/realm/store/RealmWrapperImpl.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/infra/enrolment-records/realm-store/src/main/java/com/simprints/infra/enrolment/records/realm/store/RealmWrapperImpl.kt b/infra/enrolment-records/realm-store/src/main/java/com/simprints/infra/enrolment/records/realm/store/RealmWrapperImpl.kt index 35307646e7..6d0236c1b5 100644 --- a/infra/enrolment-records/realm-store/src/main/java/com/simprints/infra/enrolment/records/realm/store/RealmWrapperImpl.kt +++ b/infra/enrolment-records/realm-store/src/main/java/com/simprints/infra/enrolment/records/realm/store/RealmWrapperImpl.kt @@ -18,6 +18,8 @@ import io.realm.kotlin.MutableRealm import io.realm.kotlin.Realm import io.realm.kotlin.RealmConfiguration import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -34,8 +36,9 @@ class RealmWrapperImpl @Inject constructor( // https://www.mongodb.com/docs/realm/sdk/kotlin/realm-database/frozen-arch/#thread-safe-realms private lateinit var realm: Realm private lateinit var config: RealmConfiguration + private val mutex = Mutex() - private fun getRealm(): Realm { + private suspend fun getRealm(): Realm { if (!this::realm.isInitialized) { config = createAndSaveRealmConfig() realm = createRealm() @@ -43,9 +46,9 @@ class RealmWrapperImpl @Inject constructor( return realm } - private fun createRealm(): Realm { + private suspend fun createRealm(): Realm = mutex.withLock { Simber.d("[RealmWrapperImpl] getting new realm instance", tag = REALM_DB) - return try { + try { try { Realm.open(config) } catch (ex: IllegalStateException) {