summaryrefslogtreecommitdiffstats
path: root/telephony
diff options
context:
space:
mode:
authorWink Saville <wink@google.com>2011-05-23 13:42:14 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-05-23 13:42:14 -0700
commit9a8ea20d4b3975d3f771364fb9f2272c32f8cad1 (patch)
treee85a69162c52228c5d084f18429dd3b8a2888a81 /telephony
parentb1817383050986413805fbbf2c1cc5c03417574d (diff)
parent070eecef394175d7344cdadde675e8977a1609f0 (diff)
downloadframeworks_base-9a8ea20d4b3975d3f771364fb9f2272c32f8cad1.zip
frameworks_base-9a8ea20d4b3975d3f771364fb9f2272c32f8cad1.tar.gz
frameworks_base-9a8ea20d4b3975d3f771364fb9f2272c32f8cad1.tar.bz2
am 070eecef: Merge "Map multiple apnType to one DataConnection fixes." into honeycomb-LTE
* commit '070eecef394175d7344cdadde675e8977a1609f0': Map multiple apnType to one DataConnection fixes.
Diffstat (limited to 'telephony')
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnection.java99
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnectionAc.java37
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnectionTracker.java2
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java63
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() {