Chromium Code Reviews| Index: components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java |
| diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java |
| index 345692dc565c1e8efbbb3e1241d0c14a3e41c3bf..b4f990f77669b20e4a3e4896a47107aa7069ee71 100644 |
| --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java |
| +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java |
| @@ -22,6 +22,7 @@ import org.chromium.net.BidirectionalStream; |
| import org.chromium.net.CronetEngine; |
| import org.chromium.net.NetworkQualityRttListener; |
| import org.chromium.net.NetworkQualityThroughputListener; |
| +import org.chromium.net.RequestFinishedListener; |
| import org.chromium.net.UrlRequest; |
| import org.chromium.net.urlconnection.CronetHttpURLConnection; |
| import org.chromium.net.urlconnection.CronetURLStreamHandlerFactory; |
| @@ -68,6 +69,7 @@ public class CronetUrlRequestContext extends CronetEngine { |
| * addition and removal may occur on a different thread from notification. |
| */ |
| private final Object mNetworkQualityLock = new Object(); |
| + private final Object mFinishedListenerLock = new Object(); |
|
tbansal1
2016/07/26 20:37:26
May be add a separate comment block for this.
xunjieli
2016/07/26 21:11:09
Can you add a comment here?
mgersh
2016/07/27 20:54:12
Done.
mgersh
2016/07/27 20:54:12
Done.
|
| @GuardedBy("mNetworkQualityLock") |
| private final ObserverList<NetworkQualityRttListener> mRttListenerList = |
| @@ -77,7 +79,7 @@ public class CronetUrlRequestContext extends CronetEngine { |
| private final ObserverList<NetworkQualityThroughputListener> mThroughputListenerList = |
| new ObserverList<NetworkQualityThroughputListener>(); |
| - @GuardedBy("mNetworkQualityLock") |
| + @GuardedBy("mFinishedListenerLock") |
| private final ObserverList<RequestFinishedListener> mFinishedListenerList = |
| new ObserverList<RequestFinishedListener>(); |
| @@ -153,11 +155,9 @@ public class CronetUrlRequestContext extends CronetEngine { |
| boolean disableConnectionMigration) { |
| synchronized (mLock) { |
| checkHaveAdapter(); |
| - boolean metricsCollectionEnabled = mNetworkQualityEstimatorEnabled; |
| - if (metricsCollectionEnabled) { // Collect metrics only if someone is listening. |
| - synchronized (mNetworkQualityLock) { |
| - metricsCollectionEnabled = !mFinishedListenerList.isEmpty(); |
| - } |
| + boolean metricsCollectionEnabled = false; |
| + synchronized (mFinishedListenerLock) { |
| + metricsCollectionEnabled = !mFinishedListenerList.isEmpty(); |
| } |
| return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations, |
| metricsCollectionEnabled, disableCache, disableConnectionMigration); |
| @@ -379,14 +379,7 @@ public class CronetUrlRequestContext extends CronetEngine { |
| */ |
| @Override |
| public void addRequestFinishedListener(RequestFinishedListener listener) { |
| - if (!mNetworkQualityEstimatorEnabled) { |
| - throw new IllegalStateException("Network quality estimator must be enabled"); |
| - } |
| - // RequestFinishedListener does not provide its own executor. |
| - if (mNetworkQualityExecutor == null) { |
| - throw new IllegalStateException("Executor must not be null"); |
| - } |
| - synchronized (mNetworkQualityLock) { |
| + synchronized (mFinishedListenerLock) { |
| mFinishedListenerList.addObserver(listener); |
| } |
| } |
| @@ -396,10 +389,7 @@ public class CronetUrlRequestContext extends CronetEngine { |
| */ |
| @Override |
| public void removeRequestFinishedListener(RequestFinishedListener listener) { |
| - if (!mNetworkQualityEstimatorEnabled) { |
| - throw new IllegalStateException("Network quality estimator must be enabled"); |
| - } |
| - synchronized (mNetworkQualityLock) { |
| + synchronized (mFinishedListenerLock) { |
| mFinishedListenerList.removeObserver(listener); |
| } |
| } |
| @@ -528,30 +518,18 @@ public class CronetUrlRequestContext extends CronetEngine { |
| } |
| void reportFinished(final CronetUrlRequest request) { |
| - if (!mNetworkQualityEstimatorEnabled) { |
| - return; |
| - } |
| - // If no request finished listener has been added, then mNetworkQualityExecutor may be |
| - // null. Exit early to avoid posting to a null executor. |
| - synchronized (mNetworkQualityLock) { |
| - if (mFinishedListenerList.isEmpty()) { |
| - return; |
| - } |
| - } |
| - Runnable task = new Runnable() { |
| - @Override |
| - public void run() { |
| - synchronized (mNetworkQualityLock) { |
| - UrlRequestInfo requestInfo = request.getRequestInfo(); |
| - for (RequestFinishedListener listener : mFinishedListenerList) { |
| + final UrlRequestInfo requestInfo = request.getRequestInfo(); |
| + synchronized (mFinishedListenerLock) { |
| + for (final RequestFinishedListener listener : mFinishedListenerList) { |
| + Runnable task = new Runnable() { |
| + @Override |
| + public void run() { |
| listener.onRequestFinished(requestInfo); |
| } |
| - } |
| + }; |
| + postObservationTaskToExecutor(listener.getExecutor(), task); |
|
xunjieli
2016/07/26 21:11:09
We shouldn't call into the executor, which might h
mgersh
2016/07/27 20:54:12
Done. I also changed mFinishedListenerList from an
xunjieli
2016/07/29 16:35:24
Acknowledged. I agree with you.
|
| } |
| - }; |
| - // Use {@link mNetworkQualityExecutor} since |
| - // RequestFInishedListeners do not provide an executor. |
| - postObservationTaskToExecutor(mNetworkQualityExecutor, task); |
| + } |
| } |
| private static void postObservationTaskToExecutor(Executor executor, Runnable task) { |