From 1b9efeb049ef34701cb7888dd042e63caea67f6d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 1 Mar 2021 09:38:33 -0500 Subject: [PATCH] Go back to using a reentrant lock for store operations. --- .../securesms/crypto/DatabaseSessionLock.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSessionLock.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSessionLock.java index eb38050d1a..3d9d70b0cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSessionLock.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSessionLock.java @@ -4,8 +4,11 @@ import net.sqlcipher.database.SQLiteDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.whispersystems.signalservice.api.SignalSessionLock; +import java.util.concurrent.locks.ReentrantLock; + /** * An implementation of {@link SignalSessionLock} that effectively re-uses our database lock. */ @@ -15,25 +18,32 @@ public enum DatabaseSessionLock implements SignalSessionLock { public static final long NO_OWNER = -1; + private static final ReentrantLock LEGACY_LOCK = new ReentrantLock(); + private volatile long ownerThreadId = NO_OWNER; @Override public Lock acquire() { - SQLiteDatabase db = DatabaseFactory.getInstance(ApplicationDependencies.getApplication()).getRawDatabase(); + if (FeatureFlags.internalUser()) { + SQLiteDatabase db = DatabaseFactory.getInstance(ApplicationDependencies.getApplication()).getRawDatabase(); - if (db.isDbLockedByCurrentThread()) { - return () -> {}; + if (db.isDbLockedByCurrentThread()) { + return () -> {}; + } + + db.beginTransaction(); + + ownerThreadId = Thread.currentThread().getId(); + + return () -> { + ownerThreadId = -1; + db.setTransactionSuccessful(); + db.endTransaction(); + }; + } else { + LEGACY_LOCK.lock(); + return LEGACY_LOCK::unlock; } - - db.beginTransaction(); - - ownerThreadId = Thread.currentThread().getId(); - - return () -> { - ownerThreadId = -1; - db.setTransactionSuccessful(); - db.endTransaction(); - }; } /**