From 5c3a3b418135ccc8ac0f7ab4a0d5e95ace7f6240 Mon Sep 17 00:00:00 2001 From: fanchao Date: Wed, 17 Dec 2025 09:49:32 +1100 Subject: [PATCH] Fix deadlock --- .../securesms/dependencies/ConfigFactory.kt | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt index 3b05669f7d..fa66df6431 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.dependencies +import androidx.collection.arrayMapOf import androidx.collection.arraySetOf import dagger.Lazy import kotlinx.coroutines.CoroutineScope @@ -141,6 +142,7 @@ class ConfigFactory @Inject constructor( lock.writeLock().lock() return configs to { val changed = arraySetOf() + var dumped: MutableMap? = null for (type in UserConfigType.entries) { val config = configs.getConfig(type) @@ -149,17 +151,33 @@ class ConfigFactory @Inject constructor( } if (config.needsDump()) { - configDatabase.storeConfig( - variant = type.configVariant, - publicKey = requiresCurrentUserAccountId().hexString, - data = config.dump(), - timestamp = clock.currentTimeMills() - ) + if (dumped == null) { + dumped = arrayMapOf() + } + + dumped[type] = config.dump() } } lock.writeLock().unlock() + // Persist dumped configs + if (dumped != null) { + coroutineScope.launch { + val userAccountId = requiresCurrentUserAccountId() + val currentTimeMs = clock.currentTimeMills() + + for ((type, data) in dumped) { + configDatabase.storeConfig( + variant = type.configVariant, + publicKey = userAccountId.hexString, + data = data, + timestamp = currentTimeMs + ) + } + } + } + // Notify changes on a coroutine if (changed.isNotEmpty()) { coroutineScope.launch { @@ -180,19 +198,31 @@ class ConfigFactory @Inject constructor( configs.groupKeys.needsDump() || configs.groupKeys.needsRekey() - if (configs.groupInfo.needsDump() || configs.groupMembers.needsDump() || + val dumped = if (configs.groupInfo.needsDump() || configs.groupMembers.needsDump() || configs.groupKeys.needsDump()) { - configDatabase.storeGroupConfigs( - publicKey = groupId.hexString, - keysConfig = configs.groupKeys.dump(), - infoConfig = configs.groupInfo.dump(), - memberConfig = configs.groupMembers.dump(), - timestamp = clock.currentTimeMills() + Triple( + configs.groupKeys.dump(), + configs.groupInfo.dump(), + configs.groupMembers.dump() ) + } else { + null } lock.writeLock().unlock() + if (dumped != null) { + coroutineScope.launch { + configDatabase.storeGroupConfigs( + publicKey = groupId.hexString, + keysConfig = dumped.first, + infoConfig = dumped.second, + memberConfig = dumped.third, + timestamp = clock.currentTimeMills() + ) + } + } + // Notify changes on a coroutine if (changed) { coroutineScope.launch {