Skip to content

Commit 21f9093

Browse files
authored
Merge pull request #843 from vector-im/feature/fga/coroutine_dispatcher
Feature/fga/coroutine dispatcher
2 parents e308b1d + 4012317 commit 21f9093

File tree

9 files changed

+68
-64
lines changed

9 files changed

+68
-64
lines changed

app/src/main/kotlin/io/element/android/x/di/AppModule.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ import kotlinx.coroutines.CoroutineName
3737
import kotlinx.coroutines.CoroutineScope
3838
import kotlinx.coroutines.Dispatchers
3939
import kotlinx.coroutines.MainScope
40-
import kotlinx.coroutines.asCoroutineDispatcher
4140
import kotlinx.coroutines.plus
4241
import java.io.File
43-
import java.util.concurrent.Executors
4442

4543
@Module
4644
@ContributesTo(AppScope::class)
@@ -99,7 +97,6 @@ object AppModule {
9997
io = Dispatchers.IO,
10098
computation = Dispatchers.Default,
10199
main = Dispatchers.Main,
102-
diffUpdateDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
103100
)
104101
}
105102

libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/CoroutineDispatchers.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,4 @@ data class CoroutineDispatchers(
2222
val io: CoroutineDispatcher,
2323
val computation: CoroutineDispatcher,
2424
val main: CoroutineDispatcher,
25-
val diffUpdateDispatcher: CoroutineDispatcher,
2625
)

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import io.element.android.libraries.matrix.impl.verification.RustSessionVerifica
5454
import io.element.android.libraries.sessionstorage.api.SessionStore
5555
import io.element.android.services.toolbox.api.systemclock.SystemClock
5656
import kotlinx.coroutines.CoroutineScope
57-
import kotlinx.coroutines.Dispatchers
57+
import kotlinx.coroutines.ExperimentalCoroutinesApi
5858
import kotlinx.coroutines.cancel
5959
import kotlinx.coroutines.flow.filter
6060
import kotlinx.coroutines.flow.first
@@ -73,6 +73,7 @@ import org.matrix.rustcomponents.sdk.CreateRoomParameters as RustCreateRoomParam
7373
import org.matrix.rustcomponents.sdk.RoomPreset as RustRoomPreset
7474
import org.matrix.rustcomponents.sdk.RoomVisibility as RustRoomVisibility
7575

76+
@OptIn(ExperimentalCoroutinesApi::class)
7677
class RustMatrixClient constructor(
7778
private val client: Client,
7879
private val sessionStore: SessionStore,
@@ -85,13 +86,15 @@ class RustMatrixClient constructor(
8586

8687
override val sessionId: UserId = UserId(client.userId())
8788
private val roomListService = client.roomListServiceWithEncryption()
89+
private val sessionDispatcher = dispatchers.io.limitedParallelism(64)
8890
private val sessionCoroutineScope = appCoroutineScope.childScope(dispatchers.main, "Session-${sessionId}")
8991
private val verificationService = RustSessionVerificationService()
9092
private val syncService = RustSyncService(roomListService, sessionCoroutineScope)
9193
private val pushersService = RustPushersService(
9294
client = client,
9395
dispatchers = dispatchers,
9496
)
97+
9598
private val notificationService = RustNotificationService(client)
9699

97100
private val clientDelegate = object : ClientDelegate {
@@ -105,7 +108,7 @@ class RustMatrixClient constructor(
105108
RustRoomSummaryDataSource(
106109
roomListService = roomListService,
107110
sessionCoroutineScope = sessionCoroutineScope,
108-
coroutineDispatchers = dispatchers,
111+
dispatcher = sessionDispatcher,
109112
)
110113

111114
override val roomSummaryDataSource: RoomSummaryDataSource
@@ -150,7 +153,7 @@ class RustMatrixClient constructor(
150153
)
151154
}
152155

153-
private suspend fun pairOfRoom(roomId: RoomId): Pair<RoomListItem, Room>? = withContext(dispatchers.io) {
156+
private suspend fun pairOfRoom(roomId: RoomId): Pair<RoomListItem, Room>? = withContext(sessionDispatcher) {
154157
val cachedRoomListItem = roomListService.roomOrNull(roomId.value)
155158
val fullRoom = cachedRoomListItem?.fullRoom()
156159
if (cachedRoomListItem == null || fullRoom == null) {
@@ -165,19 +168,19 @@ class RustMatrixClient constructor(
165168
return roomId?.let { getRoom(it) }
166169
}
167170

168-
override suspend fun ignoreUser(userId: UserId): Result<Unit> = withContext(dispatchers.io) {
171+
override suspend fun ignoreUser(userId: UserId): Result<Unit> = withContext(sessionDispatcher) {
169172
runCatching {
170173
client.ignoreUser(userId.value)
171174
}
172175
}
173176

174-
override suspend fun unignoreUser(userId: UserId): Result<Unit> = withContext(dispatchers.io) {
177+
override suspend fun unignoreUser(userId: UserId): Result<Unit> = withContext(sessionDispatcher) {
175178
runCatching {
176179
client.unignoreUser(userId.value)
177180
}
178181
}
179182

180-
override suspend fun createRoom(createRoomParams: CreateRoomParameters): Result<RoomId> = withContext(dispatchers.io) {
183+
override suspend fun createRoom(createRoomParams: CreateRoomParameters): Result<RoomId> = withContext(sessionDispatcher) {
181184
runCatching {
182185
val rustParams = RustCreateRoomParameters(
183186
name = createRoomParams.name,
@@ -221,14 +224,14 @@ class RustMatrixClient constructor(
221224
return createRoom(createRoomParams)
222225
}
223226

224-
override suspend fun getProfile(userId: UserId): Result<MatrixUser> = withContext(Dispatchers.IO) {
227+
override suspend fun getProfile(userId: UserId): Result<MatrixUser> = withContext(sessionDispatcher) {
225228
runCatching {
226229
client.getProfile(userId.value).let(UserProfileMapper::map)
227230
}
228231
}
229232

230233
override suspend fun searchUsers(searchTerm: String, limit: Long): Result<MatrixSearchUserResults> =
231-
withContext(dispatchers.io) {
234+
withContext(sessionDispatcher) {
232235
runCatching {
233236
client.searchUsers(searchTerm, limit.toULong()).let(UserSearchResultMapper::map)
234237
}
@@ -260,7 +263,7 @@ class RustMatrixClient constructor(
260263
baseDirectory.deleteSessionDirectory(userID = sessionId.value, deleteCryptoDb = false)
261264
}
262265

263-
override suspend fun logout() = withContext(dispatchers.io) {
266+
override suspend fun logout() = withContext(sessionDispatcher) {
264267
try {
265268
client.logout()
266269
} catch (failure: Throwable) {
@@ -271,20 +274,20 @@ class RustMatrixClient constructor(
271274
sessionStore.removeSession(sessionId.value)
272275
}
273276

274-
override suspend fun loadUserDisplayName(): Result<String> = withContext(dispatchers.io) {
277+
override suspend fun loadUserDisplayName(): Result<String> = withContext(sessionDispatcher) {
275278
runCatching {
276279
client.displayName()
277280
}
278281
}
279282

280-
override suspend fun loadUserAvatarURLString(): Result<String?> = withContext(dispatchers.io) {
283+
override suspend fun loadUserAvatarURLString(): Result<String?> = withContext(sessionDispatcher) {
281284
runCatching {
282285
client.avatarUrl()
283286
}
284287
}
285288

286289
@OptIn(ExperimentalUnsignedTypes::class)
287-
override suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result<String> = withContext(dispatchers.io) {
290+
override suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result<String> = withContext(sessionDispatcher) {
288291
runCatching {
289292
client.uploadMedia(mimeType, data.toUByteArray().toList(), progressCallback?.toProgressWatcher())
290293
}
@@ -305,7 +308,7 @@ class RustMatrixClient constructor(
305308
private suspend fun File.getCacheSize(
306309
userID: String,
307310
includeCryptoDb: Boolean = false,
308-
): Long = withContext(dispatchers.io) {
311+
): Long = withContext(sessionDispatcher) {
309312
// Rust sanitises the user ID replacing invalid characters with an _
310313
val sanitisedUserID = userID.replace(":", "_")
311314
val sessionDirectory = File(this@getCacheSize, sanitisedUserID)
@@ -327,7 +330,7 @@ class RustMatrixClient constructor(
327330
private suspend fun File.deleteSessionDirectory(
328331
userID: String,
329332
deleteCryptoDb: Boolean = false,
330-
): Boolean = withContext(dispatchers.io) {
333+
): Boolean = withContext(sessionDispatcher) {
331334
// Rust sanitises the user ID replacing invalid characters with an _
332335
val sanitisedUserID = userID.replace(":", "_")
333336
val sessionDirectory = File(this@deleteSessionDirectory, sanitisedUserID)

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/media/RustMediaLoader.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
2020
import io.element.android.libraries.matrix.api.media.MatrixMediaLoader
2121
import io.element.android.libraries.matrix.api.media.MediaFile
2222
import io.element.android.libraries.matrix.api.media.MediaSource
23+
import kotlinx.coroutines.ExperimentalCoroutinesApi
2324
import kotlinx.coroutines.withContext
2425
import org.matrix.rustcomponents.sdk.Client
2526
import org.matrix.rustcomponents.sdk.mediaSourceFromUrl
@@ -29,10 +30,12 @@ import org.matrix.rustcomponents.sdk.MediaSource as RustMediaSource
2930

3031
class RustMediaLoader(
3132
baseCacheDirectory: File,
32-
private val dispatchers: CoroutineDispatchers,
33+
dispatchers: CoroutineDispatchers,
3334
private val innerClient: Client,
3435
) : MatrixMediaLoader {
3536

37+
@OptIn(ExperimentalCoroutinesApi::class)
38+
private val mediaDispatcher = dispatchers.io.limitedParallelism(32)
3639
private val cacheDirectory = File(baseCacheDirectory, "temp/media").apply {
3740
if (!exists()) {
3841
mkdirs()
@@ -41,7 +44,7 @@ class RustMediaLoader(
4144

4245
@OptIn(ExperimentalUnsignedTypes::class)
4346
override suspend fun loadMediaContent(source: MediaSource): Result<ByteArray> =
44-
withContext(dispatchers.io) {
47+
withContext(mediaDispatcher) {
4548
runCatching {
4649
source.toRustMediaSource().use { source ->
4750
innerClient.getMediaContent(source).toUByteArray().toByteArray()
@@ -55,7 +58,7 @@ class RustMediaLoader(
5558
width: Long,
5659
height: Long
5760
): Result<ByteArray> =
58-
withContext(dispatchers.io) {
61+
withContext(mediaDispatcher) {
5962
runCatching {
6063
source.toRustMediaSource().use { mediaSource ->
6164
innerClient.getMediaThumbnail(
@@ -68,7 +71,7 @@ class RustMediaLoader(
6871
}
6972

7073
override suspend fun downloadMediaFile(source: MediaSource, mimeType: String?, body: String?): Result<MediaFile> =
71-
withContext(dispatchers.io) {
74+
withContext(mediaDispatcher) {
7275
runCatching {
7376
source.toRustMediaSource().use { mediaSource ->
7477
val mediaFile = innerClient.getMediaFile(

0 commit comments

Comments
 (0)