summaryrefslogtreecommitdiffstats
path: root/telephony/java
diff options
context:
space:
mode:
authorJohn Wang <johnwang@google.com>2010-12-28 16:20:41 -0800
committerJohn Wang <johnwang@google.com>2010-12-28 17:14:18 -0800
commit00d520b66caeef722281b76d30c0e1294070713d (patch)
tree20579da6efac89c15b3385da1610f773221b2389 /telephony/java
parent6eef0ca59438a15d14be8a72b6b29f01da91a5b8 (diff)
downloadframeworks_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.java71
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++) {