From 785c4a52f1db455bc5508833e5f7778b2e103e2b Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 10 Jul 2023 13:08:55 +0200 Subject: [PATCH] Sync: should avoid having multiple sync loops --- .../matrix/impl/sync/RustSyncService.kt | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt index 2103833704..3ce188a0b7 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/sync/RustSyncService.kt @@ -24,23 +24,30 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import org.matrix.rustcomponents.sdk.RoomListService import org.matrix.rustcomponents.sdk.RoomListServiceState +import timber.log.Timber +import java.util.concurrent.atomic.AtomicBoolean class RustSyncService( private val roomListService: RoomListService, sessionCoroutineScope: CoroutineScope ) : SyncService { + private val isSyncing = AtomicBoolean(false) + override fun startSync() = runCatching { - if (!roomListService.isSyncing()) { + if (isSyncing.compareAndSet(false, true)) { + Timber.v("Start sync") roomListService.sync() } } override fun stopSync() = runCatching { - if (roomListService.isSyncing()) { + if (isSyncing.compareAndSet(true, false)) { + Timber.v("Stop sync") roomListService.stopSync() } } @@ -49,6 +56,12 @@ class RustSyncService( roomListService .stateFlow() .map(RoomListServiceState::toSyncState) + .onEach { state -> + Timber.v("Sync state=$state") + if (state == SyncState.InError || state == SyncState.Terminated) { + isSyncing.set(false) + } + } .distinctUntilChanged() - .stateIn(sessionCoroutineScope, SharingStarted.WhileSubscribed(), SyncState.Idle) + .stateIn(sessionCoroutineScope, SharingStarted.Eagerly, SyncState.Idle) }