Merge change 23067 into eclair

* changes:
  allow delaying after yielding
This commit is contained in:
Android (Google) Code Review
2009-08-27 21:49:05 -07:00
2 changed files with 40 additions and 4 deletions

View File

@@ -47785,6 +47785,19 @@
visibility="public"
>
</method>
<method name="yieldIfContendedSafely"
return="boolean"
abstract="false"
native="false"
synchronized="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
<parameter name="sleepAfterYieldDelay" type="long">
</parameter>
</method>
<field name="CREATE_IF_NECESSARY"
type="int"
transient="false"

View File

@@ -519,7 +519,8 @@ public class SQLiteDatabase extends SQLiteClosable {
*/
@Deprecated
public boolean yieldIfContended() {
return yieldIfContendedHelper(false /* do not check yielding */);
return yieldIfContendedHelper(false /* do not check yielding */,
-1 /* sleepAfterYieldDelay */);
}
/**
@@ -527,14 +528,29 @@ public class SQLiteDatabase extends SQLiteClosable {
* successful so far. Do not call setTransactionSuccessful before calling this. When this
* returns a new transaction will have been created but not marked as successful. This assumes
* that there are no nested transactions (beginTransaction has only been called once) and will
* through an exception if that is not the case.
* throw an exception if that is not the case.
* @return true if the transaction was yielded
*/
public boolean yieldIfContendedSafely() {
return yieldIfContendedHelper(true /* check yielding */);
return yieldIfContendedHelper(true /* check yielding */, -1 /* sleepAfterYieldDelay*/);
}
private boolean yieldIfContendedHelper(boolean checkFullyYielded) {
/**
* Temporarily end the transaction to let other threads run. The transaction is assumed to be
* successful so far. Do not call setTransactionSuccessful before calling this. When this
* returns a new transaction will have been created but not marked as successful. This assumes
* that there are no nested transactions (beginTransaction has only been called once) and will
* throw an exception if that is not the case.
* @param sleepAfterYieldDelay if > 0, sleep this long before starting a new transaction if
* the lock was actually yielded. This will allow other background threads to make some
* more progress than they would if we started the transaction immediately.
* @return true if the transaction was yielded
*/
public boolean yieldIfContendedSafely(long sleepAfterYieldDelay) {
return yieldIfContendedHelper(true /* check yielding */, sleepAfterYieldDelay);
}
private boolean yieldIfContendedHelper(boolean checkFullyYielded, long sleepAfterYieldDelay) {
if (mLock.getQueueLength() == 0) {
// Reset the lock acquire time since we know that the thread was willing to yield
// the lock at this time.
@@ -550,6 +566,13 @@ public class SQLiteDatabase extends SQLiteClosable {
"Db locked more than once. yielfIfContended cannot yield");
}
}
if (sleepAfterYieldDelay > 0) {
try {
Thread.sleep(sleepAfterYieldDelay);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
beginTransaction();
return true;
}