diff options
| author | 2011-05-29 09:00:21 -0700 | |
|---|---|---|
| committer | 2011-05-29 09:00:21 -0700 | |
| commit | 1bbcc6953ae692206052e62b6adae15e221ec356 (patch) | |
| tree | 3fb1f5ca856b02548185065336abec63ec43044c | |
| parent | 59e699f13db9a32f30108e25577685bb39b3dae4 (diff) | |
| parent | 10b364b4bea8537f955bbbb8b9b40061264b29c9 (diff) | |
am 10b364b4: am 4cf0eee7: Merge "Fixing concurrency issue on IccPhoneBookInterfaceManager."
* commit '10b364b4bea8537f955bbbb8b9b40061264b29c9':
Fixing concurrency issue on IccPhoneBookInterfaceManager.
3 files changed, 43 insertions, 34 deletions
diff --git a/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java b/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java index 2f22d7448ed5..45562ca96e44 100644 --- a/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java +++ b/telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java @@ -24,6 +24,7 @@ import android.os.Message; import android.os.ServiceManager; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; /** * SimPhoneBookInterfaceManager to provide an inter-process communication to @@ -63,14 +64,14 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { " total " + recordSize[1] + " #record " + recordSize[2]); } - mLock.notifyAll(); + notifyPending(ar); } break; case EVENT_UPDATE_DONE: ar = (AsyncResult) msg.obj; synchronized (mLock) { success = (ar.exception == null); - mLock.notifyAll(); + notifyPending(ar); } break; case EVENT_LOAD_DONE: @@ -84,11 +85,20 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { records.clear(); } } - mLock.notifyAll(); + notifyPending(ar); } break; } } + + private void notifyPending(AsyncResult ar) { + if (ar.userObj == null) { + return; + } + AtomicBoolean status = (AtomicBoolean) ar.userObj; + status.set(true); + mLock.notifyAll(); + } }; public IccPhoneBookInterfaceManager(PhoneBase phone) { @@ -150,15 +160,12 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { synchronized(mLock) { checkThread(); success = false; - Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE); + AtomicBoolean status = new AtomicBoolean(false); + Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, status); AdnRecord oldAdn = new AdnRecord(oldTag, oldPhoneNumber); AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber); adnCache.updateAdnBySearch(efid, oldAdn, newAdn, pin2, response); - try { - mLock.wait(); - } catch (InterruptedException e) { - logd("interrupted while trying to update by search"); - } + waitForResult(status); } return success; } @@ -197,14 +204,11 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { synchronized(mLock) { checkThread(); success = false; - Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE); + AtomicBoolean status = new AtomicBoolean(false); + Message response = mBaseHandler.obtainMessage(EVENT_UPDATE_DONE, status); AdnRecord newAdn = new AdnRecord(newTag, newPhoneNumber); adnCache.updateAdnByIndex(efid, newAdn, index, pin2, response); - try { - mLock.wait(); - } catch (InterruptedException e) { - logd("interrupted while trying to update by index"); - } + waitForResult(status); } return success; } @@ -243,15 +247,12 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { synchronized(mLock) { checkThread(); - Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE); + AtomicBoolean status = new AtomicBoolean(false); + Message response = mBaseHandler.obtainMessage(EVENT_LOAD_DONE, status); adnCache.requestLoadAllAdnLike(efid, adnCache.extensionEfForEf(efid), response); - try { - mLock.wait(); - } catch (InterruptedException e) { - logd("interrupted while trying to load from the SIM"); - } + waitForResult(status); } - return records; + return records; } protected void checkThread() { @@ -265,6 +266,16 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub { } } + protected void waitForResult(AtomicBoolean status) { + while (!status.get()) { + try { + mLock.wait(); + } catch (InterruptedException e) { + logd("interrupted while trying to update by search"); + } + } + } + private int updateEfForIccType(int efid) { // Check if we are trying to read ADN records if (efid == IccConstants.EF_ADN) { diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimPhoneBookInterfaceManager.java b/telephony/java/com/android/internal/telephony/cdma/RuimPhoneBookInterfaceManager.java index ce330666ea22..04ee2dd83009 100644 --- a/telephony/java/com/android/internal/telephony/cdma/RuimPhoneBookInterfaceManager.java +++ b/telephony/java/com/android/internal/telephony/cdma/RuimPhoneBookInterfaceManager.java @@ -16,6 +16,8 @@ package com.android.internal.telephony.cdma; +import java.util.concurrent.atomic.AtomicBoolean; + import android.os.Message; import android.util.Log; @@ -56,14 +58,11 @@ public class RuimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager recordSize = new int[3]; //Using mBaseHandler, no difference in EVENT_GET_SIZE_DONE handling - Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE); + AtomicBoolean status = new AtomicBoolean(false); + Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE, status); phone.getIccFileHandler().getEFLinearRecordSize(efid, response); - try { - mLock.wait(); - } catch (InterruptedException e) { - logd("interrupted while trying to load from the RUIM"); - } + waitForResult(status); } return recordSize; diff --git a/telephony/java/com/android/internal/telephony/gsm/SimPhoneBookInterfaceManager.java b/telephony/java/com/android/internal/telephony/gsm/SimPhoneBookInterfaceManager.java index 377f8f040a74..35ba0d112e1e 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SimPhoneBookInterfaceManager.java +++ b/telephony/java/com/android/internal/telephony/gsm/SimPhoneBookInterfaceManager.java @@ -16,6 +16,8 @@ package com.android.internal.telephony.gsm; +import java.util.concurrent.atomic.AtomicBoolean; + import android.os.Message; import android.util.Log; @@ -56,14 +58,11 @@ public class SimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager { recordSize = new int[3]; //Using mBaseHandler, no difference in EVENT_GET_SIZE_DONE handling - Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE); + AtomicBoolean status = new AtomicBoolean(false); + Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE, status); phone.getIccFileHandler().getEFLinearRecordSize(efid, response); - try { - mLock.wait(); - } catch (InterruptedException e) { - logd("interrupted while trying to load from the SIM"); - } + waitForResult(status); } return recordSize; |