Sync: use a single threaded executor to ensure we have only one sync at a time

This commit is contained in:
ganfra 2019-07-10 15:55:30 +02:00 committed by Benoit Marty
parent ddf4a81905
commit b8669d5ed2
8 changed files with 16 additions and 12 deletions

View File

@ -19,4 +19,4 @@ package im.vector.matrix.android
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main


internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main) internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main, Main)

View File

@ -18,15 +18,15 @@ package im.vector.matrix.android.internal.di


import android.content.Context import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import android.os.Handler
import android.os.HandlerThread
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import im.vector.matrix.android.internal.util.createBackgroundHandler import im.vector.matrix.android.internal.util.createBackgroundHandler
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.android.asCoroutineDispatcher
import kotlinx.coroutines.asCoroutineDispatcher
import org.matrix.olm.OlmManager import org.matrix.olm.OlmManager
import java.util.concurrent.Executors


@Module @Module
internal object MatrixModule { internal object MatrixModule {
@ -38,7 +38,8 @@ internal object MatrixModule {
return MatrixCoroutineDispatchers(io = Dispatchers.IO, return MatrixCoroutineDispatchers(io = Dispatchers.IO,
computation = Dispatchers.IO, computation = Dispatchers.IO,
main = Dispatchers.Main, main = Dispatchers.Main,
crypto = createBackgroundHandler("Crypto_Thread").asCoroutineDispatcher() crypto = createBackgroundHandler("Crypto_Thread").asCoroutineDispatcher(),
sync = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
) )
} }



View File

@ -105,8 +105,8 @@ open class SyncService : Service() {
Timber.v("Execute sync request with timeout 0") Timber.v("Execute sync request with timeout 0")
val params = SyncTask.Params(TIME_OUT) val params = SyncTask.Params(TIME_OUT)
cancelableTask = syncTask.configureWith(params) cancelableTask = syncTask.configureWith(params)
.callbackOn(TaskThread.CALLER) .callbackOn(TaskThread.SYNC)
.executeOn(TaskThread.CALLER) .executeOn(TaskThread.SYNC)
.dispatchTo(object : MatrixCallback<Unit> { .dispatchTo(object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) { override fun onSuccess(data: Unit) {
cancelableTask = null cancelableTask = null

View File

@ -97,8 +97,8 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask,
val latch = CountDownLatch(1) val latch = CountDownLatch(1)
val params = SyncTask.Params(DEFAULT_LONG_POOL_TIMEOUT) val params = SyncTask.Params(DEFAULT_LONG_POOL_TIMEOUT)
cancelableTask = syncTask.configureWith(params) cancelableTask = syncTask.configureWith(params)
.callbackOn(TaskThread.CALLER) .callbackOn(TaskThread.SYNC)
.executeOn(TaskThread.CALLER) .executeOn(TaskThread.SYNC)
.dispatchTo(object : MatrixCallback<Unit> { .dispatchTo(object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) { override fun onSuccess(data: Unit) {
latch.countDown() latch.countDown()

View File

@ -62,8 +62,8 @@ internal class SyncWorker(context: Context,
val latch = CountDownLatch(1) val latch = CountDownLatch(1)
val taskParams = SyncTask.Params(0) val taskParams = SyncTask.Params(0)
cancelableTask = syncTask.configureWith(taskParams) cancelableTask = syncTask.configureWith(taskParams)
.callbackOn(TaskThread.CALLER) .callbackOn(TaskThread.SYNC)
.executeOn(TaskThread.CALLER) .executeOn(TaskThread.SYNC)
.dispatchTo(object : MatrixCallback<Unit> { .dispatchTo(object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) { override fun onSuccess(data: Unit) {
latch.countDown() latch.countDown()

View File

@ -77,6 +77,7 @@ internal class TaskExecutor @Inject constructor(private val coroutineDispatchers
TaskThread.IO -> coroutineDispatchers.io TaskThread.IO -> coroutineDispatchers.io
TaskThread.CALLER -> EmptyCoroutineContext TaskThread.CALLER -> EmptyCoroutineContext
TaskThread.CRYPTO -> coroutineDispatchers.crypto TaskThread.CRYPTO -> coroutineDispatchers.crypto
TaskThread.SYNC -> coroutineDispatchers.sync
} }





View File

@ -21,5 +21,6 @@ internal enum class TaskThread {
COMPUTATION, COMPUTATION,
IO, IO,
CALLER, CALLER,
CRYPTO CRYPTO,
SYNC
} }

View File

@ -22,5 +22,6 @@ internal data class MatrixCoroutineDispatchers(
val io: CoroutineDispatcher, val io: CoroutineDispatcher,
val computation: CoroutineDispatcher, val computation: CoroutineDispatcher,
val main: CoroutineDispatcher, val main: CoroutineDispatcher,
val crypto: CoroutineDispatcher val crypto: CoroutineDispatcher,
val sync: CoroutineDispatcher
) )