diff options
| -rw-r--r-- | services/core/java/com/android/server/connectivity/PacManager.java | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java index 34826b669347..d56fb1ab09f9 100644 --- a/services/core/java/com/android/server/connectivity/PacManager.java +++ b/services/core/java/com/android/server/connectivity/PacManager.java @@ -15,6 +15,7 @@ */ package com.android.server.connectivity; +import android.annotation.WorkerThread; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -74,7 +75,7 @@ public class PacManager { public static final String KEY_PROXY = "keyProxy"; private String mCurrentPac; @GuardedBy("mProxyLock") - private Uri mPacUrl = Uri.EMPTY; + private volatile Uri mPacUrl = Uri.EMPTY; private AlarmManager mAlarmManager; @GuardedBy("mProxyLock") @@ -87,33 +88,37 @@ public class PacManager { private int mCurrentDelay; private int mLastPort; - private boolean mHasSentBroadcast; - private boolean mHasDownloaded; + private volatile boolean mHasSentBroadcast; + private volatile boolean mHasDownloaded; private Handler mConnectivityHandler; 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(); + /** + * 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() { @Override + @WorkerThread public void run() { String file; - synchronized (mProxyLock) { - if (Uri.EMPTY.equals(mPacUrl)) return; - final int oldTag = TrafficStats - .getAndSetThreadStatsTag(TrafficStats.TAG_SYSTEM_PAC); - try { - file = get(mPacUrl); - } catch (IOException ioe) { - file = null; - Log.w(TAG, "Failed to load PAC file: " + ioe); - } finally { - TrafficStats.setThreadStatsTag(oldTag); - } + final Uri pacUrl = mPacUrl; + if (Uri.EMPTY.equals(pacUrl)) return; + final int oldTag = TrafficStats.getAndSetThreadStatsTag(TrafficStats.TAG_SYSTEM_PAC); + try { + file = get(pacUrl); + } catch (IOException ioe) { + file = null; + Log.w(TAG, "Failed to load PAC file: " + ioe); + } finally { + TrafficStats.setThreadStatsTag(oldTag); } if (file != null) { synchronized (mProxyLock) { @@ -176,9 +181,7 @@ public class PacManager { // Allow to send broadcast, nothing to do. return false; } - synchronized (mProxyLock) { - mPacUrl = proxy.getPacFileUrl(); - } + mPacUrl = proxy.getPacFileUrl(); mCurrentDelay = DELAY_1; mHasSentBroadcast = false; mHasDownloaded = false; |