am 5511c669: Merge change 23067 into eclair

Merge commit '5511c66955d96019ee62ac334d73e4d2bcda178b' into eclair-plus-aosp

* commit '5511c66955d96019ee62ac334d73e4d2bcda178b':
  allow delaying after yielding
This commit is contained in:
Fred Quintana
2009-08-27 21:50:56 -07:00
committed by Android Git Automerger
2 changed files with 40 additions and 4 deletions

View File

@@ -47785,6 +47785,19 @@
visibility="public" visibility="public"
> >
</method> </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" <field name="CREATE_IF_NECESSARY"
type="int" type="int"
transient="false" transient="false"

View File

@@ -519,7 +519,8 @@ public class SQLiteDatabase extends SQLiteClosable {
*/ */
@Deprecated @Deprecated
public boolean yieldIfContended() { 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 * 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 * 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 * 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 * @return true if the transaction was yielded
*/ */
public boolean yieldIfContendedSafely() { 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) { if (mLock.getQueueLength() == 0) {
// Reset the lock acquire time since we know that the thread was willing to yield // Reset the lock acquire time since we know that the thread was willing to yield
// the lock at this time. // the lock at this time.
@@ -550,6 +566,13 @@ public class SQLiteDatabase extends SQLiteClosable {
"Db locked more than once. yielfIfContended cannot yield"); "Db locked more than once. yielfIfContended cannot yield");
} }
} }
if (sleepAfterYieldDelay > 0) {
try {
Thread.sleep(sleepAfterYieldDelay);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
beginTransaction(); beginTransaction();
return true; return true;
} }