Revert "ROOM patch: refactoring"

This reverts commit 3a0083ad44.
This commit is contained in:
M66B 2024-05-13 17:26:18 +02:00
parent a88379a09d
commit 048c558ebd
2 changed files with 84 additions and 77 deletions

View File

@ -23,7 +23,6 @@ import java.lang.RuntimeException
import java.util.concurrent.Callable import java.util.concurrent.Callable
import java.util.concurrent.Executor import java.util.concurrent.Executor
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
/** /**
* A LiveData implementation that closely works with [InvalidationTracker] to implement * A LiveData implementation that closely works with [InvalidationTracker] to implement
@ -55,52 +54,58 @@ internal class RoomTrackingLiveData<T> (
val invalid = AtomicBoolean(true) val invalid = AtomicBoolean(true)
val computing = AtomicBoolean(false) val computing = AtomicBoolean(false)
val registeredObserver = AtomicBoolean(false) val registeredObserver = AtomicBoolean(false)
val queued = AtomicInteger(0); val queued = eu.faircode.email.ObjectHolder<Int>(0)
val lock = Object()
val refreshRunnable = Runnable { 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)) { if (registeredObserver.compareAndSet(false, true)) {
database.invalidationTracker.addWeakObserver(observer) database.invalidationTracker.addWeakObserver(observer)
} }
val v = queued.decrementAndGet(); var value: T? = null
if (v < 0) { var computed = false
queued.set(0) synchronized(computeFunction) {
eu.faircode.email.Log.e("$computeFunction queued=$v") var retry = 0
} else if (v > 0) while (!computed) {
eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=$v") try {
value = computeFunction.call()
if (v <= 0) { computed = true
var value: T? = null } catch (e: Throwable) {
var computed = false if (++retry > 5) {
synchronized(computeFunction) { eu.faircode.email.Log.e(e)
var retry = 0 break
while (!computed) { }
eu.faircode.email.Log.w(e)
try { try {
value = computeFunction.call() Thread.sleep(2000L)
computed = true } catch (ignored: InterruptedException) {
} catch (e: Throwable) {
if (++retry > 5) {
eu.faircode.email.Log.e(e)
break
}
eu.faircode.email.Log.w(e)
try {
Thread.sleep(2000L)
} catch (ignored: InterruptedException) {
}
} }
} }
} }
if (computed) { }
postValue(value) if (computed) {
} postValue(value)
} }
} }
val invalidationRunnable = Runnable { val invalidationRunnable = Runnable {
val isActive = hasActiveObservers() val isActive = hasActiveObservers()
if (isActive) { if (isActive) {
queued.incrementAndGet() synchronized(lock) {
queryExecutor.execute(refreshRunnable) if (queued.value > 0) {
eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=" + queued.value)
} else {
queued.value++
queryExecutor.execute(refreshRunnable)
}
}
} }
} }
@ -108,8 +113,10 @@ internal class RoomTrackingLiveData<T> (
override fun onActive() { override fun onActive() {
super.onActive() super.onActive()
container.onActive(this as LiveData<Any>) container.onActive(this as LiveData<Any>)
queued.incrementAndGet(); synchronized(lock) {
queryExecutor.execute(refreshRunnable) queued.value++
queryExecutor.execute(refreshRunnable)
}
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")

View File

@ -21,22 +21,15 @@ index 38067b702f..76cf95815c 100644
} }
if (invalidatedTableIds.isNotEmpty()) { if (invalidatedTableIds.isNotEmpty()) {
diff --git a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt diff --git a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
index 171b57d16e..32317b296a 100644 index 171b57d16e..85c14c1a93 100644
--- a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt --- a/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
+++ b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt +++ b/app/src/main/java/androidx/room/RoomTrackingLiveData.kt
@@ -23,6 +23,7 @@ import java.lang.RuntimeException @@ -54,62 +54,70 @@ internal class RoomTrackingLiveData<T> (
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 invalid = AtomicBoolean(true)
val computing = AtomicBoolean(false) val computing = AtomicBoolean(false)
val registeredObserver = AtomicBoolean(false) val registeredObserver = AtomicBoolean(false)
+ val queued = AtomicInteger(0); + val queued = eu.faircode.email.ObjectHolder<Int>(0)
+ val lock = Object()
val refreshRunnable = Runnable { val refreshRunnable = Runnable {
- if (registeredObserver.compareAndSet(false, true)) { - if (registeredObserver.compareAndSet(false, true)) {
- database.invalidationTracker.addWeakObserver(observer) - database.invalidationTracker.addWeakObserver(observer)
@ -77,42 +70,41 @@ index 171b57d16e..32317b296a 100644
- // We've left invalid in set state. The check below recovers. - // We've left invalid in set state. The check below recovers.
- } while (computed && invalid.get()) - } 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)) { + if (registeredObserver.compareAndSet(false, true)) {
+ database.invalidationTracker.addWeakObserver(observer) + database.invalidationTracker.addWeakObserver(observer)
+ } + }
+ +
+ val v = queued.decrementAndGet(); + var value: T? = null
+ if (v < 0) { + var computed = false
+ queued.set(0) + synchronized(computeFunction) {
+ eu.faircode.email.Log.e("$computeFunction queued=$v") + var retry = 0
+ } else if (v > 0) + while (!computed) {
+ eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug1, "$computeFunction queued=$v") + try {
+ + value = computeFunction.call()
+ if (v <= 0) { + computed = true
+ var value: T? = null + } catch (e: Throwable) {
+ var computed = false + if (++retry > 5) {
+ synchronized(computeFunction) { + eu.faircode.email.Log.e(e)
+ var retry = 0 + break
+ while (!computed) { + }
+ eu.faircode.email.Log.w(e)
+ try { + try {
+ value = computeFunction.call() + Thread.sleep(2000L)
+ computed = true + } catch (ignored: InterruptedException) {
+ } catch (e: Throwable) {
+ if (++retry > 5) {
+ eu.faircode.email.Log.e(e)
+ break
+ }
+ eu.faircode.email.Log.w(e)
+ try {
+ Thread.sleep(2000L)
+ } catch (ignored: InterruptedException) {
+ }
+ } + }
+ } + }
+ } + }
+ if (computed) { + }
+ postValue(value) + if (computed) {
+ } + postValue(value)
+ } + }
+ } + }
@ -126,8 +118,14 @@ index 171b57d16e..32317b296a 100644
- } - }
+ val isActive = hasActiveObservers() + val isActive = hasActiveObservers()
+ if (isActive) { + if (isActive) {
+ queued.incrementAndGet() + synchronized(lock) {
+ queryExecutor.execute(refreshRunnable) + if (queued.value > 0) {
+ eu.faircode.email.Log.persist(eu.faircode.email.EntityLog.Type.Debug, "$computeFunction queued=" + queued.value)
+ } else {
+ queued.value++
+ queryExecutor.execute(refreshRunnable)
+ }
+ }
+ } + }
+ } + }
@ -139,8 +137,10 @@ index 171b57d16e..32317b296a 100644
- } - }
+ super.onActive() + super.onActive()
+ container.onActive(this as LiveData<Any>) + container.onActive(this as LiveData<Any>)
+ queued.incrementAndGet(); + synchronized(lock) {
+ queryExecutor.execute(refreshRunnable) + queued.value++
+ queryExecutor.execute(refreshRunnable)
+ }
+ } + }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")