| 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 e1035c47f58a0088b4efac593beb52c0edc9b51a..783267ea4c2cc2ca5a3b2091fd0e3aade1f9dd39 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
|
| @@ -61,7 +61,15 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| private final ConditionVariable mInitCompleted = new ConditionVariable(false);
|
| private final AtomicInteger mActiveRequestCount = new AtomicInteger(0);
|
|
|
| + @GuardedBy("mLock")
|
| private long mUrlRequestContextAdapter = 0;
|
| + /**
|
| + * This field is accessed without synchronization, but only for the purposes of reference
|
| + * equality comparison with other threads. If such a comparison is performed on the network
|
| + * thread, then there is a happens-before edge between the write of this field and the
|
| + * subsequent read; if it's performed on another thread, then observing a value of null won't
|
| + * change the result of the comparison.
|
| + */
|
| private Thread mNetworkThread;
|
|
|
| private boolean mNetworkQualityEstimatorEnabled;
|
| @@ -182,7 +190,7 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| @Override
|
| public UrlRequest createRequest(String url, UrlRequest.Callback callback, Executor executor,
|
| int priority, Collection<Object> requestAnnotations, boolean disableCache,
|
| - boolean disableConnectionMigration) {
|
| + boolean disableConnectionMigration, boolean allowDirectExecutor) {
|
| synchronized (mLock) {
|
| checkHaveAdapter();
|
| boolean metricsCollectionEnabled = false;
|
| @@ -190,7 +198,8 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| metricsCollectionEnabled = !mFinishedListenerList.isEmpty();
|
| }
|
| return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations,
|
| - metricsCollectionEnabled, disableCache, disableConnectionMigration);
|
| + metricsCollectionEnabled, disableCache, disableConnectionMigration,
|
| + allowDirectExecutor);
|
| }
|
| }
|
|
|
| @@ -320,7 +329,9 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| throw new IllegalStateException("Network quality estimator must be enabled");
|
| }
|
| synchronized (mNetworkQualityLock) {
|
| - checkHaveAdapter();
|
| + synchronized (mLock) {
|
| + checkHaveAdapter();
|
| + }
|
| return mEffectiveConnectionType;
|
| }
|
| }
|
| @@ -463,12 +474,14 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| }
|
| }
|
|
|
| + @GuardedBy("mLock")
|
| private void checkHaveAdapter() throws IllegalStateException {
|
| if (!haveRequestContextAdapter()) {
|
| throw new IllegalStateException("Engine is shut down.");
|
| }
|
| }
|
|
|
| + @GuardedBy("mLock")
|
| private boolean haveRequestContextAdapter() {
|
| return mUrlRequestContextAdapter != 0;
|
| }
|
| @@ -492,10 +505,8 @@ public class CronetUrlRequestContext extends CronetEngine {
|
| @SuppressWarnings("unused")
|
| @CalledByNative
|
| private void initNetworkThread() {
|
| - synchronized (mLock) {
|
| - mNetworkThread = Thread.currentThread();
|
| - mInitCompleted.open();
|
| - }
|
| + mNetworkThread = Thread.currentThread();
|
| + mInitCompleted.open();
|
| Thread.currentThread().setName("ChromiumNet");
|
| Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
| }
|
| @@ -626,4 +637,8 @@ public class CronetUrlRequestContext extends CronetEngine {
|
|
|
| @NativeClassQualifiedName("CronetURLRequestContextAdapter")
|
| private native void nativeProvideThroughputObservations(long nativePtr, boolean should);
|
| +
|
| + public boolean isNetworkThread(Thread thread) {
|
| + return thread == mNetworkThread;
|
| + }
|
| }
|
|
|