diff options
author | Wink Saville <wink@google.com> | 2011-05-24 08:42:10 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-05-24 08:42:10 -0700 |
commit | fb9eebc42744598ed3360c1dc485cf2509145b79 (patch) | |
tree | 305e91c7d9409789f3c3594c895001aa64f8789e /telephony | |
parent | 9a4285474c2eddf45dc5c184a58fe8113afbe1b9 (diff) | |
parent | 9a8ea20d4b3975d3f771364fb9f2272c32f8cad1 (diff) | |
download | frameworks_base-fb9eebc42744598ed3360c1dc485cf2509145b79.zip frameworks_base-fb9eebc42744598ed3360c1dc485cf2509145b79.tar.gz frameworks_base-fb9eebc42744598ed3360c1dc485cf2509145b79.tar.bz2 |
am 9a8ea20d: am 070eecef: Merge "Map multiple apnType to one DataConnection fixes." into honeycomb-LTE
* commit '9a8ea20d4b3975d3f771364fb9f2272c32f8cad1':
Map multiple apnType to one DataConnection fixes.
Diffstat (limited to 'telephony')
4 files changed, 112 insertions, 89 deletions
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index dc07ef2..3636baa 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -205,6 +205,7 @@ public abstract class DataConnection extends StateMachine { protected long lastFailTime; protected FailCause lastFailCause; protected static final String NULL_IP = "0.0.0.0"; + private int mRefCount; Object userData; //***** Abstract methods @@ -413,49 +414,6 @@ public abstract class DataConnection extends StateMachine { return mRetryMgr.configure(configStr); } - private AtomicInteger mRefCount = new AtomicInteger(0); - - /** - * Set refCount. - * - * @param val is new refCount - */ - public void setRefCount(int val) { - mRefCount.set(val); - } - - /** - * Get refCount - * - * @return refCount - */ - public int getRefCount() { - return mRefCount.get(); - } - - /** - * @return decrement and return refCount - * - * TODO: Consider using the refCount for defining the - * life time of a connection. When this goes zero the - * DataConnection could tear itself down. - */ - public int decAndGetRefCount() { - int v = mRefCount.decrementAndGet(); - if (v < 0) { - log("BUG: decAndGetRefCount caused refCount to be < 0"); - mRefCount.set(0); - } - return v; - } - - /** - * @return increment and return refCount - */ - public int incAndGetRefCount() { - return mRefCount.incrementAndGet(); - } - /* * ************************************************************************** * End members owned by DataConnectionTracker @@ -471,6 +429,7 @@ public abstract class DataConnection extends StateMachine { createTime = -1; lastFailTime = -1; lastFailCause = FailCause.NONE; + mRefCount = 0; mLinkProperties = new LinkProperties(); mApn = null; @@ -674,6 +633,11 @@ public abstract class DataConnection extends StateMachine { mAc.replyToMessage(msg, DataConnectionAc.RSP_RESET); transitionTo(mInactiveState); break; + case DataConnectionAc.REQ_GET_REFCOUNT: { + log("REQ_GET_REFCOUNT refCount=" + mRefCount); + mAc.replyToMessage(msg, DataConnectionAc.RSP_GET_REFCOUNT, mRefCount); + break; + } case EVENT_CONNECT: if (DBG) log("DcDefaultState: msg.what=EVENT_CONNECT, fail not expected"); @@ -774,9 +738,13 @@ public abstract class DataConnection extends StateMachine { break; case EVENT_CONNECT: - if (DBG) log("DcInactiveState msg.what=EVENT_CONNECT"); ConnectionParams cp = (ConnectionParams) msg.obj; cp.tag = mTag; + if (DBG) { + log("DcInactiveState msg.what=EVENT_CONNECT." + "RefCount = " + + mRefCount); + } + mRefCount = 1; onConnect(cp); transitionTo(mActivatingState); retVal = HANDLED; @@ -804,7 +772,15 @@ public abstract class DataConnection extends StateMachine { switch (msg.what) { case EVENT_DISCONNECT: - if (DBG) log("DcActivatingState deferring msg.what=EVENT_DISCONNECT"); + if (DBG) log("DcActivatingState deferring msg.what=EVENT_DISCONNECT" + + mRefCount); + deferMessage(msg); + retVal = HANDLED; + break; + + case EVENT_CONNECT: + if (DBG) log("DcActivatingState deferring msg.what=EVENT_CONNECT refCount = " + + mRefCount); deferMessage(msg); retVal = HANDLED; break; @@ -928,12 +904,28 @@ public abstract class DataConnection extends StateMachine { boolean retVal; switch (msg.what) { + case EVENT_CONNECT: + mRefCount++; + if (DBG) log("DcActiveState msg.what=EVENT_CONNECT RefCount=" + mRefCount); + if (msg.obj != null) { + notifyConnectCompleted((ConnectionParams) msg.obj, FailCause.NONE); + } + retVal = HANDLED; + break; case EVENT_DISCONNECT: - if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT"); - DisconnectParams dp = (DisconnectParams) msg.obj; - dp.tag = mTag; - tearDownData(dp); - transitionTo(mDisconnectingState); + mRefCount--; + if (DBG) log("DcActiveState msg.what=EVENT_DISCONNECT RefCount=" + mRefCount); + if (mRefCount == 0) + { + DisconnectParams dp = (DisconnectParams) msg.obj; + dp.tag = mTag; + tearDownData(dp); + transitionTo(mDisconnectingState); + } else { + if (msg.obj != null) { + notifyDisconnectCompleted((DisconnectParams) msg.obj); + } + } retVal = HANDLED; break; @@ -956,6 +948,13 @@ public abstract class DataConnection extends StateMachine { boolean retVal; switch (msg.what) { + case EVENT_CONNECT: + if (DBG) log("DcDisconnectingState msg.what=EVENT_CONNECT. Defer. RefCount = " + + mRefCount); + deferMessage(msg); + retVal = HANDLED; + break; + case EVENT_DEACTIVATE_DONE: if (DBG) log("DcDisconnectingState msg.what=EVENT_DEACTIVATE_DONE"); AsyncResult ar = (AsyncResult) msg.obj; diff --git a/telephony/java/com/android/internal/telephony/DataConnectionAc.java b/telephony/java/com/android/internal/telephony/DataConnectionAc.java index 939bab2..a0d9b0f 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionAc.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionAc.java @@ -59,6 +59,9 @@ public class DataConnectionAc extends AsyncChannel { public static final int REQ_RESET = BASE + 14; public static final int RSP_RESET = BASE + 15; + public static final int REQ_GET_REFCOUNT = BASE + 16; + public static final int RSP_GET_REFCOUNT = BASE + 17; + /** * enum used to notify action taken or necessary to be * taken after the link property is changed. @@ -152,6 +155,40 @@ public class DataConnectionAc extends AsyncChannel { } /** + * Request the Reference Count. + * Response {@link #rspRefCount} + */ + public void reqRefCount() { + sendMessage(REQ_GET_REFCOUNT); + if (DBG) log("reqRefCount"); + } + + /** + * Evaluate a RSP_GET_REFCOUNT message and return the refCount. + * + * @param response Message + * @return ref count or -1 if an error + */ + public int rspRefCount(Message response) { + int retVal = response.arg1; + if (DBG) log("rspRefCount=" + retVal); + return retVal; + } + + /** + * @return connection id or -1 if an error + */ + public int getRefCountSync() { + Message response = sendMessageSynchronously(REQ_GET_REFCOUNT); + if ((response != null) && (response.what == RSP_GET_REFCOUNT)) { + return rspRefCount(response); + } else { + log("rspRefCount error response=" + response); + return -1; + } + } + + /** * Request the connections ApnSetting. * Response {@link #rspApnSetting} */ diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java index b7ac879..5ddfcd1 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java @@ -987,7 +987,7 @@ public abstract class DataConnectionTracker extends Handler { resetAllRetryCounts(); onTrySetupData(Phone.REASON_DATA_ENABLED); } else { - onCleanUpConnection(true, APN_DEFAULT_ID, Phone.REASON_DATA_DISABLED); + onCleanUpAllConnections(Phone.REASON_DATA_DISABLED); } } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 3c660b3..e1a6fef 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -612,28 +612,26 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { * * @param apnContext * @param tearDown - * @return refCount + * @return none */ - private int releaseApnContext(ApnContext apnContext, boolean tearDown) { + private void releaseApnContext(ApnContext apnContext, boolean tearDown) { if (apnContext == null) { if (DBG) loge("releaseApnContext: apnContext null should not happen, ignore"); - return -1; + return; } DataConnection dc = apnContext.getDataConnection(); if (dc == null) { if (DBG) loge("releaseApnContext: apnContext dc == null should not happen, ignore"); - return -1; + return; } - int refCount = dc.decAndGetRefCount(); - if (DBG) log("releaseApnContext: dec refCount=" + refCount + " tearDown=" + tearDown); - if (tearDown && (refCount == 0)) { + if (tearDown) { if (DBG) log("releaseApnContext: tearing down"); Message msg = obtainMessage(EVENT_DISCONNECT_DONE, apnContext); apnContext.getDataConnection().tearDown(apnContext.getReason(), msg); } apnContext.setDataConnection(null); apnContext.setDataConnectionAc(null); - return refCount; + return; } private void setupDataOnReadyApns(String reason) { @@ -809,12 +807,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { apnContext.setState(State.DISCONNECTING); releaseApnContext(apnContext, tearDown); } else { - // STOPSHIP: Reference counting logic in GDCT still have issue. - // Need to be cleaned up in later patch dcac.resetSync(); - if (apnContext.getDataConnection() != null) { - apnContext.getDataConnection().setRefCount(0); - } apnContext.setState(State.IDLE); mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType()); apnContext.setDataConnection(null); @@ -946,7 +939,12 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { dc = (GsmDataConnection)apnContext.getDataConnection(); if (dc == null) { - dc = findReadyDataConnection(apn); + + dc = (GsmDataConnection) checkForConnectionForApnContext(apnContext); + + if (dc == null) { + dc = findReadyDataConnection(apn); + } if (dc == null) { if (DBG) log("setupData: No ready GsmDataConnection found!"); @@ -964,16 +962,16 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { return false; } + DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId()); dc.setProfileId( profileId ); dc.setActiveApnType(apnContext.getApnType()); - int refCount = dc.incAndGetRefCount(); + int refCount = dcac.getRefCountSync(); if (DBG) log("setupData: init dc and apnContext refCount=" + refCount); // configure retry count if no other Apn is using the same connection. - if (refCount == 1) { + if (refCount == 0) { configureRetry(dc, apnContext.getApnType()); } - DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId()); apnContext.setDataConnectionAc(mDataConnectionAsyncChannels.get(dc.getDataConnectionId())); apnContext.setApnSetting(apn); apnContext.setDataConnection(dc); @@ -1493,23 +1491,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { } else { apnContext.setReason(Phone.REASON_DATA_ENABLED); } - DataConnection conn = checkForConnectionForApnContext(apnContext); - if (conn == null) { - if (apnContext.getState() == State.FAILED) { - apnContext.setState(State.IDLE); - } - trySetup = true; - } else { - int refCount = conn.incAndGetRefCount(); - apnContext.setDataConnection(conn); - apnContext.setDataConnectionAc( - mDataConnectionAsyncChannels.get(conn.getDataConnectionId())); - if (DBG) { - log("applyNewState: Found existing connection for " + - apnContext.getApnType() + " inc refCount=" + refCount + - " conn=" + conn); - } + if (apnContext.getState() == State.FAILED) { + apnContext.setState(State.IDLE); } + trySetup = true; } } apnContext.setEnabled(enabled); @@ -1644,7 +1629,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { if (DBG) { log(String.format("onDataSetupComplete: success apn=%s", - apnContext.getWaitingApns().get(0).apn) + " refCount=" + dc.getRefCount()); + apnContext.getWaitingApns().get(0).apn)); } ApnSetting apn = apnContext.getApnSetting(); if (apn.proxy != null && apn.proxy.length() != 0) { @@ -1712,10 +1697,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { apnContext.setState(State.FAILED); mPhone.notifyDataConnection(Phone.REASON_APN_FAILED, apnContext.getApnType()); - int refCount = releaseApnContext(apnContext, false); + releaseApnContext(apnContext, false); if (DBG) { - log("onDataSetupComplete: permanent error apn=%s" + apnString + - " refCount=" + refCount); + log("onDataSetupComplete: permanent error apn=%s" + apnString ); } } else { if (DBG) log("onDataSetupComplete: Not all permanent failures, retry"); @@ -1809,7 +1793,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) { if (DBG) log("onCleanUpConnection"); ApnContext apnContext = mApnContexts.get(apnIdToType(apnId)); - cleanUpConnection(tearDown, apnContext); + if (apnContext != null) { + apnContext.setReason(reason); + cleanUpConnection(tearDown, apnContext); + } } protected boolean isConnected() { |