diff options
author | John Wang <johnwang@google.com> | 2010-12-28 16:20:41 -0800 |
---|---|---|
committer | John Wang <johnwang@google.com> | 2010-12-28 17:14:18 -0800 |
commit | 00d520b66caeef722281b76d30c0e1294070713d (patch) | |
tree | 20579da6efac89c15b3385da1610f773221b2389 /telephony/java | |
parent | 6eef0ca59438a15d14be8a72b6b29f01da91a5b8 (diff) | |
download | frameworks_base-00d520b66caeef722281b76d30c0e1294070713d.zip frameworks_base-00d520b66caeef722281b76d30c0e1294070713d.tar.gz frameworks_base-00d520b66caeef722281b76d30c0e1294070713d.tar.bz2 |
Clear request list while timeout.
The wakelock will be kept held if there is outstanding requests
in request list. When WAKE_LOCK_TIMEOUT occurs, all requests
in mRequestList already waited at least DEFAULT_WAKE_LOCK_TIMEOUT
but no response. Those lost requests return GENERIC_FAILURE and
request list is cleared.
bug:3292426
Change-Id: I369c6ba4d6836d65ef616140e48c7304faf888f0
Diffstat (limited to 'telephony/java')
-rw-r--r-- | telephony/java/com/android/internal/telephony/RIL.java | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java index 3d410fd..7d31687 100644 --- a/telephony/java/com/android/internal/telephony/RIL.java +++ b/telephony/java/com/android/internal/telephony/RIL.java @@ -370,23 +370,26 @@ public final class RIL extends BaseCommands implements CommandsInterface { case EVENT_WAKE_LOCK_TIMEOUT: // Haven't heard back from the last request. Assume we're // not getting a response and release the wake lock. - // TODO should we clean up mRequestList and mRequestPending synchronized (mWakeLock) { if (mWakeLock.isHeld()) { - if (RILJ_LOGD) { - synchronized (mRequestsList) { - int count = mRequestsList.size(); - Log.d(LOG_TAG, "WAKE_LOCK_TIMEOUT " + - " mReqPending=" + mRequestMessagesPending + - " mRequestList=" + count); - - for (int i = 0; i < count; i++) { - rr = mRequestsList.get(i); - Log.d(LOG_TAG, i + ": [" + rr.mSerial + "] " + - requestToString(rr.mRequest)); - - } - } + // The timer of WAKE_LOCK_TIMEOUT is reset with each + // new send request. So when WAKE_LOCK_TIMEOUT occurs + // all requests in mRequestList already waited at + // least DEFAULT_WAKE_LOCK_TIMEOUT but no response. + // Therefore all should be treated as lost requests. + // Those lost requests return GENERIC_FAILURE and + // request list is cleared. + // + // Note: mRequestMessagesPending shows how many + // requests are waiting to be sent (and before + // to be added in request list) since star the + // timer. It should be + // zero here since all request should already + // be put in request list while TIMEOUT occurs. + clearRequestsList(GENERIC_FAILURE, true); + if (mRequestMessagesPending != 0) { + Log.e(LOG_TAG, "ERROR: mReqPending is NOT 0 at TIMEOUT, " + + "mReqPending = " + mRequestMessagesPending); } mWakeLock.release(); } @@ -558,15 +561,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { RILRequest.resetSerial(); // Clear request list on close - synchronized (mRequestsList) { - for (int i = 0, sz = mRequestsList.size() ; i < sz ; i++) { - RILRequest rr = mRequestsList.get(i); - rr.onError(RADIO_NOT_AVAILABLE, null); - rr.release(); - } - - mRequestsList.clear(); - } + clearRequestsList(RADIO_NOT_AVAILABLE, false); }} catch (Throwable tr) { Log.e(LOG_TAG,"Uncaught exception", tr); } @@ -2061,6 +2056,34 @@ public final class RIL extends BaseCommands implements CommandsInterface { releaseWakeLockIfDone(); } + /** + * Release each request in mReqeustsList then clear the list + * @param error is the RIL_Errno sent back + * @param loggable true means to print all requests in mRequestslist + */ + private void clearRequestsList(int error, boolean loggable) { + RILRequest rr; + synchronized (mRequestsList) { + int count = mRequestsList.size(); + if (RILJ_LOGD && loggable) { + Log.d(LOG_TAG, "WAKE_LOCK_TIMEOUT " + + " mReqPending=" + mRequestMessagesPending + + " mRequestList=" + count); + } + + for (int i = 0; i < count ; i++) { + rr = mRequestsList.get(i); + if (RILJ_LOGD && loggable) { + Log.d(LOG_TAG, i + ": [" + rr.mSerial + "] " + + requestToString(rr.mRequest)); + } + rr.onError(error, null); + rr.release(); + } + mRequestsList.clear(); + } + } + private RILRequest findAndRemoveRequestFromList(int serial) { synchronized (mRequestsList) { for (int i = 0, s = mRequestsList.size() ; i < s ; i++) { |