Run post transaction tasks only after root transaction ends.
This commit is contained in:
parent
61f50cfe60
commit
4a9a07a9ef
3 changed files with 50 additions and 6 deletions
|
@ -180,4 +180,45 @@ class SQLiteDatabaseTest {
|
||||||
assertTrue(hasRun1.get())
|
assertTrue(hasRun1.get())
|
||||||
assertTrue(hasRun2.get())
|
assertTrue(hasRun2.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun runPostSuccessfulTransaction_runsAfterMainTransactionInNestedTransaction() {
|
||||||
|
val hasRun1 = AtomicBoolean(false)
|
||||||
|
val hasRun2 = AtomicBoolean(false)
|
||||||
|
|
||||||
|
db.beginTransaction()
|
||||||
|
|
||||||
|
db.runPostSuccessfulTransaction {
|
||||||
|
assertFalse(hasRun1.get())
|
||||||
|
assertFalse(hasRun2.get())
|
||||||
|
hasRun1.set(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
assertFalse(hasRun1.get())
|
||||||
|
assertFalse(hasRun2.get())
|
||||||
|
|
||||||
|
db.beginTransaction()
|
||||||
|
|
||||||
|
db.runPostSuccessfulTransaction {
|
||||||
|
assertTrue(hasRun1.get())
|
||||||
|
assertFalse(hasRun2.get())
|
||||||
|
hasRun2.set(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
db.setTransactionSuccessful()
|
||||||
|
|
||||||
|
assertFalse(hasRun1.get())
|
||||||
|
assertFalse(hasRun2.get())
|
||||||
|
|
||||||
|
db.endTransaction()
|
||||||
|
db.setTransactionSuccessful()
|
||||||
|
|
||||||
|
assertFalse(hasRun1.get())
|
||||||
|
assertFalse(hasRun2.get())
|
||||||
|
|
||||||
|
db.endTransaction()
|
||||||
|
|
||||||
|
assertTrue(hasRun1.get())
|
||||||
|
assertTrue(hasRun2.get())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,10 +82,12 @@ class InstrumentationApplicationDependencyProvider(application: Application, def
|
||||||
arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
||||||
arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
||||||
arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)),
|
||||||
|
emptyArray(),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
Optional.of(SignalServiceNetworkAccess.DNS),
|
Optional.of(SignalServiceNetworkAccess.DNS),
|
||||||
Optional.empty(),
|
Optional.empty(),
|
||||||
Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS)
|
Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS),
|
||||||
|
Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS)
|
||||||
)
|
)
|
||||||
|
|
||||||
serviceNetworkAccessMock = mock {
|
serviceNetworkAccessMock = mock {
|
||||||
|
|
|
@ -313,12 +313,13 @@ public class SQLiteDatabase implements SupportSQLiteDatabase {
|
||||||
public void endTransaction() {
|
public void endTransaction() {
|
||||||
trace("endTransaction()", wrapped::endTransaction);
|
trace("endTransaction()", wrapped::endTransaction);
|
||||||
traceLockEnd();
|
traceLockEnd();
|
||||||
|
if (!wrapped.inTransaction()) {
|
||||||
Set<Runnable> tasks = getPostSuccessfulTransactionTasks();
|
Set<Runnable> tasks = getPostSuccessfulTransactionTasks();
|
||||||
for (Runnable r : new HashSet<>(tasks)) {
|
for (Runnable r : new HashSet<>(tasks)) {
|
||||||
r.run();
|
r.run();
|
||||||
|
}
|
||||||
|
tasks.clear();
|
||||||
}
|
}
|
||||||
tasks.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTransactionSuccessful() {
|
public void setTransactionSuccessful() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue