ROOM patch: refactoring

This commit is contained in:
M66B 2024-05-11 23:17:29 +02:00
parent 8cb5a52ae7
commit 3a0083ad44
2 changed files with 77 additions and 84 deletions

View File

@ -23,6 +23,7 @@ import java.lang.RuntimeException
import java.util.concurrent.Callable
import java.util.concurrent.Executor
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
/**
* A LiveData implementation that closely works with [InvalidationTracker] to implement
@ -54,21 +55,20 @@ internal class RoomTrackingLiveData<T> (
val invalid = AtomicBoolean(true)
val computing = AtomicBoolean(false)
val registeredObserver = AtomicBoolean(false)
val queued = eu.faircode.email.ObjectHolder<Int>(0)
val lock = Object()
val queued = AtomicInteger(0);
val refreshRunnable = Runnable {
synchronized(lock) {
queued.value--
if (queued.value < 0) {
eu.faircode.email.Log.e("$computeFunction queued=" + queued.value)
queued.value = 0
}
}
if (registeredObserver.compareAndSet(false, true)) {
database.invalidationTracker.addWeakObserver(observer)
}
val v = queued.decrementAndGet();
if (v < 0) {
queued.set(0)
eu.faircode.email.Log.e("$computeFunction queued=$v")
} else if (v > 0)
eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=$v")
if (v <= 0) {
var value: T? = null
var computed = false
synchronized(computeFunction) {
@ -94,30 +94,23 @@ internal class RoomTrackingLiveData<T> (
postValue(value)
}
}
}
val invalidationRunnable = Runnable {
val isActive = hasActiveObservers()
if (isActive) {
synchronized(lock) {
if (queued.value > 0) {
eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=" + queued.value)
} else {
queued.value++
queued.incrementAndGet()
queryExecutor.execute(refreshRunnable)
}
}
}
}
@Suppress("UNCHECKED_CAST")
override fun onActive() {
super.onActive()
container.onActive(this as LiveData<Any>)
synchronized(lock) {
queued.value++
queued.incrementAndGet();
queryExecutor.execute(refreshRunnable)
}
}
@Suppress("UNCHECKED_CAST")
override fun onInactive() {

View File

@ -21,15 +21,22 @@ index 38067b702f..76cf95815c 100644
}
if (invalidatedTableIds.isNotEmpty()) {
diff --git a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
index 171b57d16e..85c14c1a93 100644
index 171b57d16e..32317b296a 100644
--- a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
+++ b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
@@ -54,62 +54,70 @@ internal class RoomTrackingLiveData<T> (
@@ -23,6 +23,7 @@ import java.lang.RuntimeException
import java.util.concurrent.Callable
import java.util.concurrent.Executor
import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicInteger
/**
* A LiveData implementation that closely works with [InvalidationTracker] to implement
@@ -54,62 +55,62 @@ internal class RoomTrackingLiveData<T> (
val invalid = AtomicBoolean(true)
val computing = AtomicBoolean(false)
val registeredObserver = AtomicBoolean(false)
+ val queued = eu.faircode.email.ObjectHolder<Int>(0)
+ val lock = Object()
+ val queued = AtomicInteger(0);
val refreshRunnable = Runnable {
- if (registeredObserver.compareAndSet(false, true)) {
- database.invalidationTracker.addWeakObserver(observer)
@ -70,18 +77,18 @@ index 171b57d16e..85c14c1a93 100644
- // We've left invalid in set state. The check below recovers.
- } while (computed && invalid.get())
- }
+ synchronized(lock) {
+ queued.value--
+ if (queued.value < 0) {
+ eu.faircode.email.Log.e("$computeFunction queued=" + queued.value)
+ queued.value = 0
+ }
+ }
+
+ if (registeredObserver.compareAndSet(false, true)) {
+ database.invalidationTracker.addWeakObserver(observer)
+ }
+
+ val v = queued.decrementAndGet();
+ if (v < 0) {
+ queued.set(0)
+ eu.faircode.email.Log.e("$computeFunction queued=$v")
+ } else if (v > 0)
+ eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=$v")
+
+ if (v <= 0) {
+ var value: T? = null
+ var computed = false
+ synchronized(computeFunction) {
@ -106,6 +113,7 @@ index 171b57d16e..85c14c1a93 100644
+ if (computed) {
+ postValue(value)
+ }
+ }
+ }
val invalidationRunnable = Runnable {
@ -118,15 +126,9 @@ index 171b57d16e..85c14c1a93 100644
- }
+ val isActive = hasActiveObservers()
+ if (isActive) {
+ synchronized(lock) {
+ if (queued.value > 0) {
+ eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug, "$computeFunction queued=" + queued.value)
+ } else {
+ queued.value++
+ queued.incrementAndGet()
+ queryExecutor.execute(refreshRunnable)
+ }
+ }
+ }
+ }
@Suppress("UNCHECKED_CAST")
@ -137,10 +139,8 @@ index 171b57d16e..85c14c1a93 100644
- }
+ super.onActive()
+ container.onActive(this as LiveData<Any>)
+ synchronized(lock) {
+ queued.value++
+ queued.incrementAndGet();
+ queryExecutor.execute(refreshRunnable)
+ }
+ }
@Suppress("UNCHECKED_CAST")