summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Irina Dumitrescu <irinaid@google.com> 2019-04-18 19:25:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-04-18 19:25:14 +0000
commit6c4094c67da5e8ed7549e88d57d6c74d3f71a316 (patch)
treecbd11f4a0e62860ecbcd082b118c8dfd67dd28e0
parent094b9acb0dc6782783dd4efcba98598b71bbb232 (diff)
parent34a27c4c455d490116572c02f7d8443842164fd3 (diff)
Merge "Don't call ConnectivityService when holding ActivityManagerService lock." into qt-dev
-rw-r--r--core/java/android/app/ActivityThread.java8
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java6
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java29
3 files changed, 25 insertions, 18 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5e5611bcf058..474f25bd5533 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1073,9 +1073,8 @@ public final class ActivityThread extends ClientTransactionHandler {
}
public void updateHttpProxy() {
- final ConnectivityManager cm = ConnectivityManager.from(
+ ActivityThread.updateHttpProxy(
getApplication() != null ? getApplication() : getSystemContext());
- Proxy.setHttpProxySystemProperty(cm.getDefaultProxy());
}
public void processInBackground() {
@@ -6948,6 +6947,11 @@ public final class ActivityThread extends ClientTransactionHandler {
return thread;
}
+ public static void updateHttpProxy(@NonNull Context context) {
+ final ConnectivityManager cm = ConnectivityManager.from(context);
+ Proxy.setHttpProxySystemProperty(cm.getDefaultProxy());
+ }
+
@UnsupportedAppUsage
public final void installSystemProviders(List<ProviderInfo> providers) {
if (providers != null) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index aad45e6ad466..881a4ae92bc4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1635,9 +1635,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
} break;
case UPDATE_HTTP_PROXY_MSG: {
- synchronized (ActivityManagerService.this) {
- mProcessList.setAllHttpProxyLocked();
- }
+ mProcessList.setAllHttpProxy();
} break;
case PROC_START_TIMEOUT_MSG: {
ProcessRecord app = (ProcessRecord)msg.obj;
@@ -1826,7 +1824,7 @@ public class ActivityManagerService extends IActivityManager.Stub
} break;
}
}
- };
+ }
static final int COLLECT_PSS_BG_MSG = 1;
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 316368a52ce2..b85c452c7104 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -46,6 +46,7 @@ import static com.android.server.am.ActivityManagerService.TAG_PSS;
import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS;
import android.app.ActivityManager;
+import android.app.ActivityThread;
import android.app.AppGlobals;
import android.app.AppProtoEnums;
import android.app.IApplicationThread;
@@ -2486,21 +2487,25 @@ public final class ProcessList {
}
}
- @GuardedBy("mService")
- void setAllHttpProxyLocked() {
- for (int i = mLruProcesses.size() - 1; i >= 0; i--) {
- ProcessRecord r = mLruProcesses.get(i);
- // Don't dispatch to isolated processes as they can't access
- // ConnectivityManager and don't have network privileges anyway.
- if (r.thread != null && !r.isolated) {
- try {
- r.thread.updateHttpProxy();
- } catch (RemoteException ex) {
- Slog.w(TAG, "Failed to update http proxy for: " +
- r.info.processName);
+ void setAllHttpProxy() {
+ // Update the HTTP proxy for each application thread.
+ synchronized (mService) {
+ for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
+ ProcessRecord r = mLruProcesses.get(i);
+ // Don't dispatch to isolated processes as they can't access ConnectivityManager and
+ // don't have network privileges anyway. Exclude system server and update it
+ // separately outside the AMS lock, to avoid deadlock with Connectivity Service.
+ if (r.pid != ActivityManagerService.MY_PID && r.thread != null && !r.isolated) {
+ try {
+ r.thread.updateHttpProxy();
+ } catch (RemoteException ex) {
+ Slog.w(TAG, "Failed to update http proxy for: "
+ + r.info.processName);
+ }
}
}
}
+ ActivityThread.updateHttpProxy(mService.mContext);
}
@GuardedBy("mService")