Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net.impl; | 5 package org.chromium.net.impl; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.Build; | 8 import android.os.Build; |
| 9 import android.os.ConditionVariable; | 9 import android.os.ConditionVariable; |
| 10 import android.os.Handler; | 10 import android.os.Handler; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 54 private static final int LOG_VERBOSE = -2; // LOG(FATAL...INFO), VLOG(2) | 54 private static final int LOG_VERBOSE = -2; // LOG(FATAL...INFO), VLOG(2) |
| 55 static final String LOG_TAG = "ChromiumNetwork"; | 55 static final String LOG_TAG = "ChromiumNetwork"; |
| 56 | 56 |
| 57 /** | 57 /** |
| 58 * Synchronize access to mUrlRequestContextAdapter and shutdown routine. | 58 * Synchronize access to mUrlRequestContextAdapter and shutdown routine. |
| 59 */ | 59 */ |
| 60 private final Object mLock = new Object(); | 60 private final Object mLock = new Object(); |
| 61 private final ConditionVariable mInitCompleted = new ConditionVariable(false ); | 61 private final ConditionVariable mInitCompleted = new ConditionVariable(false ); |
| 62 private final AtomicInteger mActiveRequestCount = new AtomicInteger(0); | 62 private final AtomicInteger mActiveRequestCount = new AtomicInteger(0); |
| 63 | 63 |
| 64 @GuardedBy("mLock") | |
| 64 private long mUrlRequestContextAdapter = 0; | 65 private long mUrlRequestContextAdapter = 0; |
| 66 /** | |
| 67 * This field is accessed without synchronization, but only for the purposes of reference | |
| 68 * equality comparison with other threads. If such a comparison is performed on the network | |
| 69 * thread, then there is a happens-before edge between the write of this fie ld and the | |
| 70 * subsequent read; if it's performed on another thread, then observing a va lue of null won't | |
| 71 * change the result of the comparison. | |
| 72 */ | |
| 65 private Thread mNetworkThread; | 73 private Thread mNetworkThread; |
| 66 | 74 |
| 67 private boolean mNetworkQualityEstimatorEnabled; | 75 private boolean mNetworkQualityEstimatorEnabled; |
| 68 | 76 |
| 69 /** | 77 /** |
| 70 * Locks operations on network quality listeners, because listener | 78 * Locks operations on network quality listeners, because listener |
| 71 * addition and removal may occur on a different thread from notification. | 79 * addition and removal may occur on a different thread from notification. |
| 72 */ | 80 */ |
| 73 private final Object mNetworkQualityLock = new Object(); | 81 private final Object mNetworkQualityLock = new Object(); |
| 74 | 82 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 for (Builder.Pkp pkp : builder.publicKeyPins()) { | 183 for (Builder.Pkp pkp : builder.publicKeyPins()) { |
| 176 nativeAddPkp(urlRequestContextConfig, pkp.mHost, pkp.mHashes, pkp.mI ncludeSubdomains, | 184 nativeAddPkp(urlRequestContextConfig, pkp.mHost, pkp.mHashes, pkp.mI ncludeSubdomains, |
| 177 pkp.mExpirationDate.getTime()); | 185 pkp.mExpirationDate.getTime()); |
| 178 } | 186 } |
| 179 return urlRequestContextConfig; | 187 return urlRequestContextConfig; |
| 180 } | 188 } |
| 181 | 189 |
| 182 @Override | 190 @Override |
| 183 public UrlRequest createRequest(String url, UrlRequest.Callback callback, Ex ecutor executor, | 191 public UrlRequest createRequest(String url, UrlRequest.Callback callback, Ex ecutor executor, |
| 184 int priority, Collection<Object> requestAnnotations, boolean disable Cache, | 192 int priority, Collection<Object> requestAnnotations, boolean disable Cache, |
| 185 boolean disableConnectionMigration) { | 193 boolean disableConnectionMigration, boolean allowDirectExecutor) { |
| 186 synchronized (mLock) { | 194 synchronized (mLock) { |
| 187 checkHaveAdapter(); | 195 checkHaveAdapter(); |
| 188 boolean metricsCollectionEnabled = false; | 196 boolean metricsCollectionEnabled = false; |
| 189 synchronized (mFinishedListenerLock) { | 197 synchronized (mFinishedListenerLock) { |
| 190 metricsCollectionEnabled = !mFinishedListenerList.isEmpty(); | 198 metricsCollectionEnabled = !mFinishedListenerList.isEmpty(); |
| 191 } | 199 } |
| 192 return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations, | 200 return new CronetUrlRequest(this, url, priority, callback, executor, requestAnnotations, |
| 193 metricsCollectionEnabled, disableCache, disableConnectionMig ration); | 201 metricsCollectionEnabled, disableCache, disableConnectionMig ration, |
| 202 allowDirectExecutor); | |
| 194 } | 203 } |
| 195 } | 204 } |
| 196 | 205 |
| 197 @Override | 206 @Override |
| 198 public BidirectionalStream createBidirectionalStream(String url, | 207 public BidirectionalStream createBidirectionalStream(String url, |
| 199 BidirectionalStream.Callback callback, Executor executor, String htt pMethod, | 208 BidirectionalStream.Callback callback, Executor executor, String htt pMethod, |
| 200 List<Map.Entry<String, String>> requestHeaders, | 209 List<Map.Entry<String, String>> requestHeaders, |
| 201 @BidirectionalStream.Builder.StreamPriority int priority, | 210 @BidirectionalStream.Builder.StreamPriority int priority, |
| 202 boolean delayRequestHeadersUntilFirstFlush) { | 211 boolean delayRequestHeadersUntilFirstFlush) { |
| 203 synchronized (mLock) { | 212 synchronized (mLock) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 313 public byte[] getGlobalMetricsDeltas() { | 322 public byte[] getGlobalMetricsDeltas() { |
| 314 return nativeGetHistogramDeltas(); | 323 return nativeGetHistogramDeltas(); |
| 315 } | 324 } |
| 316 | 325 |
| 317 @Override | 326 @Override |
| 318 public int getEffectiveConnectionType() { | 327 public int getEffectiveConnectionType() { |
| 319 if (!mNetworkQualityEstimatorEnabled) { | 328 if (!mNetworkQualityEstimatorEnabled) { |
| 320 throw new IllegalStateException("Network quality estimator must be e nabled"); | 329 throw new IllegalStateException("Network quality estimator must be e nabled"); |
| 321 } | 330 } |
| 322 synchronized (mNetworkQualityLock) { | 331 synchronized (mNetworkQualityLock) { |
| 323 checkHaveAdapter(); | 332 synchronized (mLock) { |
| 333 checkHaveAdapter(); | |
| 334 } | |
| 324 return mEffectiveConnectionType; | 335 return mEffectiveConnectionType; |
| 325 } | 336 } |
| 326 } | 337 } |
| 327 | 338 |
| 328 @VisibleForTesting | 339 @VisibleForTesting |
| 329 @Override | 340 @Override |
| 330 public void configureNetworkQualityEstimatorForTesting( | 341 public void configureNetworkQualityEstimatorForTesting( |
| 331 boolean useLocalHostRequests, boolean useSmallerResponses) { | 342 boolean useLocalHostRequests, boolean useSmallerResponses) { |
| 332 if (!mNetworkQualityEstimatorEnabled) { | 343 if (!mNetworkQualityEstimatorEnabled) { |
| 333 throw new IllegalStateException("Network quality estimator must be e nabled"); | 344 throw new IllegalStateException("Network quality estimator must be e nabled"); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 456 } | 467 } |
| 457 | 468 |
| 458 @VisibleForTesting | 469 @VisibleForTesting |
| 459 public long getUrlRequestContextAdapter() { | 470 public long getUrlRequestContextAdapter() { |
| 460 synchronized (mLock) { | 471 synchronized (mLock) { |
| 461 checkHaveAdapter(); | 472 checkHaveAdapter(); |
| 462 return mUrlRequestContextAdapter; | 473 return mUrlRequestContextAdapter; |
| 463 } | 474 } |
| 464 } | 475 } |
| 465 | 476 |
| 477 @GuardedBy("mLock") | |
| 466 private void checkHaveAdapter() throws IllegalStateException { | 478 private void checkHaveAdapter() throws IllegalStateException { |
|
mef
2016/09/01 15:17:18
We use naming convention XyzLocked in CronetUrlReq
Charles
2016/09/01 16:45:24
But why? The compiler checks your locking once you
| |
| 467 if (!haveRequestContextAdapter()) { | 479 if (!haveRequestContextAdapter()) { |
| 468 throw new IllegalStateException("Engine is shut down."); | 480 throw new IllegalStateException("Engine is shut down."); |
| 469 } | 481 } |
| 470 } | 482 } |
| 471 | 483 |
| 484 @GuardedBy("mLock") | |
| 472 private boolean haveRequestContextAdapter() { | 485 private boolean haveRequestContextAdapter() { |
| 473 return mUrlRequestContextAdapter != 0; | 486 return mUrlRequestContextAdapter != 0; |
| 474 } | 487 } |
| 475 | 488 |
| 476 /** | 489 /** |
| 477 * @return loggingLevel see {@link #LOG_NONE}, {@link #LOG_DEBUG} and | 490 * @return loggingLevel see {@link #LOG_NONE}, {@link #LOG_DEBUG} and |
| 478 * {@link #LOG_VERBOSE}. | 491 * {@link #LOG_VERBOSE}. |
| 479 */ | 492 */ |
| 480 private int getLoggingLevel() { | 493 private int getLoggingLevel() { |
| 481 int loggingLevel; | 494 int loggingLevel; |
| 482 if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { | 495 if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { |
| 483 loggingLevel = LOG_VERBOSE; | 496 loggingLevel = LOG_VERBOSE; |
| 484 } else if (Log.isLoggable(LOG_TAG, Log.DEBUG)) { | 497 } else if (Log.isLoggable(LOG_TAG, Log.DEBUG)) { |
| 485 loggingLevel = LOG_DEBUG; | 498 loggingLevel = LOG_DEBUG; |
| 486 } else { | 499 } else { |
| 487 loggingLevel = LOG_NONE; | 500 loggingLevel = LOG_NONE; |
| 488 } | 501 } |
| 489 return loggingLevel; | 502 return loggingLevel; |
| 490 } | 503 } |
| 491 | 504 |
| 492 @SuppressWarnings("unused") | 505 @SuppressWarnings("unused") |
| 493 @CalledByNative | 506 @CalledByNative |
| 494 private void initNetworkThread() { | 507 private void initNetworkThread() { |
| 495 synchronized (mLock) { | 508 mNetworkThread = Thread.currentThread(); |
| 496 mNetworkThread = Thread.currentThread(); | 509 mInitCompleted.open(); |
| 497 mInitCompleted.open(); | |
| 498 } | |
| 499 Thread.currentThread().setName("ChromiumNet"); | 510 Thread.currentThread().setName("ChromiumNet"); |
| 500 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); | 511 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); |
| 501 } | 512 } |
| 502 | 513 |
| 503 @SuppressWarnings("unused") | 514 @SuppressWarnings("unused") |
| 504 @CalledByNative | 515 @CalledByNative |
| 505 private void onEffectiveConnectionTypeChanged(int effectiveConnectionType) { | 516 private void onEffectiveConnectionTypeChanged(int effectiveConnectionType) { |
| 506 synchronized (mNetworkQualityLock) { | 517 synchronized (mNetworkQualityLock) { |
| 507 // Convert the enum returned by the network quality estimator to an enum of type | 518 // Convert the enum returned by the network quality estimator to an enum of type |
| 508 // EffectiveConnectionType. | 519 // EffectiveConnectionType. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 619 | 630 |
| 620 @NativeClassQualifiedName("CronetURLRequestContextAdapter") | 631 @NativeClassQualifiedName("CronetURLRequestContextAdapter") |
| 621 private native void nativeConfigureNetworkQualityEstimatorForTesting( | 632 private native void nativeConfigureNetworkQualityEstimatorForTesting( |
| 622 long nativePtr, boolean useLocalHostRequests, boolean useSmallerResp onses); | 633 long nativePtr, boolean useLocalHostRequests, boolean useSmallerResp onses); |
| 623 | 634 |
| 624 @NativeClassQualifiedName("CronetURLRequestContextAdapter") | 635 @NativeClassQualifiedName("CronetURLRequestContextAdapter") |
| 625 private native void nativeProvideRTTObservations(long nativePtr, boolean sho uld); | 636 private native void nativeProvideRTTObservations(long nativePtr, boolean sho uld); |
| 626 | 637 |
| 627 @NativeClassQualifiedName("CronetURLRequestContextAdapter") | 638 @NativeClassQualifiedName("CronetURLRequestContextAdapter") |
| 628 private native void nativeProvideThroughputObservations(long nativePtr, bool ean should); | 639 private native void nativeProvideThroughputObservations(long nativePtr, bool ean should); |
| 640 | |
| 641 public boolean isNetworkThread(Thread thread) { | |
| 642 return thread == mNetworkThread; | |
| 643 } | |
| 629 } | 644 } |
| OLD | NEW |