From ddf542755f73d7ff0529721dd552b11446dd9be9 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 21 Aug 2023 17:49:19 +0200 Subject: [PATCH] Fix memory leak : parallelMap can be cancelled so all members were not destroyed --- .../matrix/impl/room/RustMatrixRoom.kt | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 373880568f..878aaa4473 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -43,8 +43,10 @@ import io.element.android.libraries.matrix.impl.media.MediaUploadHandlerImpl import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.room.location.toInner import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline +import io.element.android.libraries.matrix.impl.util.destroyAll import io.element.android.libraries.sessionstorage.api.SessionData import io.element.android.services.toolbox.api.systemclock.SystemClock +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancel @@ -55,6 +57,7 @@ import kotlinx.coroutines.withContext import org.matrix.rustcomponents.sdk.RequiredState import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.RoomListItem +import org.matrix.rustcomponents.sdk.RoomMember import org.matrix.rustcomponents.sdk.RoomSubscription import org.matrix.rustcomponents.sdk.SendAttachmentJoinHandle import org.matrix.rustcomponents.sdk.genTransactionId @@ -170,12 +173,19 @@ class RustMatrixRoom( val currentState = _membersStateFlow.value val currentMembers = currentState.roomMembers() _membersStateFlow.value = MatrixRoomMembersState.Pending(prevRoomMembers = currentMembers) - runCatching { - innerRoom.members().parallelMap(RoomMemberMapper::map) - }.map { - _membersStateFlow.value = MatrixRoomMembersState.Ready(it) - }.onFailure { - _membersStateFlow.value = MatrixRoomMembersState.Error(prevRoomMembers = currentMembers, failure = it) + var rustMembers: List? = null + try { + rustMembers = innerRoom.members() + val mappedMembers = rustMembers.parallelMap(RoomMemberMapper::map) + _membersStateFlow.value = MatrixRoomMembersState.Ready(mappedMembers) + Result.success(Unit) + } catch (cancellationException: CancellationException) { + throw cancellationException + } catch (exception: Exception) { + _membersStateFlow.value = MatrixRoomMembersState.Error(prevRoomMembers = currentMembers, failure = exception) + Result.failure(exception) + } finally { + rustMembers?.destroyAll() } }