[android][database] transaction lock condition 'awaits' now timeouts after 30 seconds if not signalled (forgot to include the handler originally also)
This commit is contained in:
parent
d8693f5e39
commit
5824e5405f
@ -0,0 +1,70 @@
|
|||||||
|
package io.invertase.firebase.database;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.locks.Condition;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
|
||||||
|
public class RNFirebaseTransactionHandler {
|
||||||
|
private final ReentrantLock lock;
|
||||||
|
private final Condition condition;
|
||||||
|
private Map<String, Object> data;
|
||||||
|
private volatile boolean isReady;
|
||||||
|
|
||||||
|
public Object value;
|
||||||
|
public boolean interrupted;
|
||||||
|
public boolean abort = false;
|
||||||
|
|
||||||
|
RNFirebaseTransactionHandler() {
|
||||||
|
lock = new ReentrantLock();
|
||||||
|
condition = lock.newCondition();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal that the transaction data has been received
|
||||||
|
*
|
||||||
|
* @param updateData
|
||||||
|
*/
|
||||||
|
public void signalUpdateReceived(Map<String, Object> updateData) {
|
||||||
|
lock.lock();
|
||||||
|
|
||||||
|
abort = (Boolean) updateData.get("abort");
|
||||||
|
value = updateData.get("value");
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (isReady)
|
||||||
|
throw new IllegalStateException("This transactionUpdateCallback has already been called.");
|
||||||
|
data = updateData;
|
||||||
|
isReady = true;
|
||||||
|
condition.signalAll();
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait for transactionUpdateReceived to signal condition
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
void await() throws InterruptedException {
|
||||||
|
lock.lock();
|
||||||
|
Boolean notTimedOut = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
while (!notTimedOut && !isReady) {
|
||||||
|
notTimedOut = condition.await(30, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Map<String, Object> getUpdates() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user