mirror of
https://github.com/element-hq/element-android
synced 2024-10-23 11:16:33 +03:00
Realm transaction, use semaphore as suggested by Dominaezzz
This commit is contained in:
parent
216138394f
commit
144d0e56cc
1 changed files with 40 additions and 19 deletions
|
@ -16,14 +16,33 @@
|
||||||
*/
|
*/
|
||||||
package org.matrix.android.sdk.internal.database
|
package org.matrix.android.sdk.internal.database
|
||||||
|
|
||||||
|
import com.zhuinden.monarchy.Monarchy
|
||||||
import io.realm.Realm
|
import io.realm.Realm
|
||||||
import io.realm.RealmConfiguration
|
import io.realm.RealmConfiguration
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.sync.Semaphore
|
||||||
|
import kotlinx.coroutines.sync.withPermit
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
suspend fun <T> awaitTransaction(config: RealmConfiguration, transaction: suspend (realm: Realm) -> T) = withContext(Dispatchers.Default) {
|
internal fun <T> CoroutineScope.asyncTransaction(monarchy: Monarchy, transaction: suspend (realm: Realm) -> T) {
|
||||||
|
asyncTransaction(monarchy.realmConfiguration, transaction)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun <T> CoroutineScope.asyncTransaction(realmConfiguration: RealmConfiguration, transaction: suspend (realm: Realm) -> T) {
|
||||||
|
launch {
|
||||||
|
awaitTransaction(realmConfiguration, transaction)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val realmSemaphore = Semaphore(1)
|
||||||
|
|
||||||
|
suspend fun <T> awaitTransaction(config: RealmConfiguration, transaction: suspend (realm: Realm) -> T): T {
|
||||||
|
return realmSemaphore.withPermit {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
Realm.getInstance(config).use { bgRealm ->
|
Realm.getInstance(config).use { bgRealm ->
|
||||||
bgRealm.beginTransaction()
|
bgRealm.beginTransaction()
|
||||||
val result: T
|
val result: T
|
||||||
|
@ -43,4 +62,6 @@ suspend fun <T> awaitTransaction(config: RealmConfiguration, transaction: suspen
|
||||||
}
|
}
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue