Merge "Stop holding mProxyLock while downloading PAC script data."

This commit is contained in:
Treehugger Robot
2017-03-22 07:47:19 +00:00
committed by Gerrit Code Review

View File

@@ -15,6 +15,7 @@
*/ */
package com.android.server.connectivity; package com.android.server.connectivity;
import android.annotation.WorkerThread;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -73,7 +74,7 @@ public class PacManager {
public static final String KEY_PROXY = "keyProxy"; public static final String KEY_PROXY = "keyProxy";
private String mCurrentPac; private String mCurrentPac;
@GuardedBy("mProxyLock") @GuardedBy("mProxyLock")
private Uri mPacUrl = Uri.EMPTY; private volatile Uri mPacUrl = Uri.EMPTY;
private AlarmManager mAlarmManager; private AlarmManager mAlarmManager;
@GuardedBy("mProxyLock") @GuardedBy("mProxyLock")
@@ -86,29 +87,34 @@ public class PacManager {
private int mCurrentDelay; private int mCurrentDelay;
private int mLastPort; private int mLastPort;
private boolean mHasSentBroadcast; private volatile boolean mHasSentBroadcast;
private boolean mHasDownloaded; private volatile boolean mHasDownloaded;
private Handler mConnectivityHandler; private Handler mConnectivityHandler;
private int mProxyMessage; private int mProxyMessage;
/** /**
* Used for locking when setting mProxyService and all references to mPacUrl or mCurrentPac. * Used for locking when setting mProxyService and all references to mCurrentPac.
*/ */
private final Object mProxyLock = new Object(); private final Object mProxyLock = new Object();
/**
* Runnable to download PAC script.
* The behavior relies on the assamption it always run on mNetThread to guarantee that the
* latest data fetched from mPacUrl is stored in mProxyService.
*/
private Runnable mPacDownloader = new Runnable() { private Runnable mPacDownloader = new Runnable() {
@Override @Override
@WorkerThread
public void run() { public void run() {
String file; String file;
synchronized (mProxyLock) { final Uri pacUrl = mPacUrl;
if (Uri.EMPTY.equals(mPacUrl)) return; if (Uri.EMPTY.equals(pacUrl)) return;
try { try {
file = get(mPacUrl); file = get(pacUrl);
} catch (IOException ioe) { } catch (IOException ioe) {
file = null; file = null;
Log.w(TAG, "Failed to load PAC file: " + ioe); Log.w(TAG, "Failed to load PAC file: " + ioe);
}
} }
if (file != null) { if (file != null) {
synchronized (mProxyLock) { synchronized (mProxyLock) {
@@ -171,9 +177,7 @@ public class PacManager {
// Allow to send broadcast, nothing to do. // Allow to send broadcast, nothing to do.
return false; return false;
} }
synchronized (mProxyLock) { mPacUrl = proxy.getPacFileUrl();
mPacUrl = proxy.getPacFileUrl();
}
mCurrentDelay = DELAY_1; mCurrentDelay = DELAY_1;
mHasSentBroadcast = false; mHasSentBroadcast = false;
mHasDownloaded = false; mHasDownloaded = false;