From 00d520b66caeef722281b76d30c0e1294070713d Mon Sep 17 00:00:00 2001 From: John Wang Date: Tue, 28 Dec 2010 16:20:41 -0800 Subject: [PATCH] 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 --- .../com/android/internal/telephony/RIL.java | 71 ++++++++++++------- 1 file 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 3d410fd2c465a..7d316874f9b4b 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++) {