Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java

Issue 1777333002: [Cronet] Fix race in UploadDataStream.attachToRequest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Helen's comments. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java
diff --git a/components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java b/components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java
index 6256d46a80979812729329f57619aebd276b9de8..72307e9ab521c48d154550b0e891d9057e36d64f 100644
--- a/components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java
+++ b/components/cronet/android/java/src/org/chromium/net/CronetUploadDataStream.java
@@ -232,7 +232,7 @@ final class CronetUploadDataStream implements UploadDataSink {
/**
* Posts task to application Executor.
*/
- private void postTaskToExecutor(Runnable task) {
+ void postTaskToExecutor(Runnable task) {
try {
mExecutor.execute(task);
} catch (Throwable e) {
@@ -294,33 +294,23 @@ final class CronetUploadDataStream implements UploadDataSink {
/**
* Creates native objects and attaches them to the underlying request
- * adapter object.
- * TODO(mmenke): If more types of native upload streams are needed, create
- * an interface with just this method, to minimize CronetURLRequest's
- * dependencies on each upload stream type.
+ * adapter object. Always called on executor thread to allow getLength() to
+ * block and/or report errors.
*/
- void attachToRequest(final CronetUrlRequest request, final long requestAdapter,
- final Runnable afterAttachCallback) {
+ void attachToRequest(final CronetUrlRequest request, final long requestAdapter) {
mRequest = request;
- postTaskToExecutor(new Runnable() {
- @Override
- public void run() {
- synchronized (mLock) {
- mInWhichUserCallback = UserCallback.GET_LENGTH;
- }
- try {
- mLength = mDataProvider.getLength();
- } catch (Throwable t) {
- onError(t);
- }
- synchronized (mLock) {
- mInWhichUserCallback = UserCallback.NOT_IN_CALLBACK;
- mUploadDataStreamAdapter =
- nativeAttachUploadDataToRequest(requestAdapter, mLength);
- }
- afterAttachCallback.run();
- }
- });
+ synchronized (mLock) {
+ mInWhichUserCallback = UserCallback.GET_LENGTH;
+ }
+ try {
+ mLength = mDataProvider.getLength();
+ } catch (Throwable t) {
+ onError(t);
+ }
+ synchronized (mLock) {
+ mInWhichUserCallback = UserCallback.NOT_IN_CALLBACK;
+ mUploadDataStreamAdapter = nativeAttachUploadDataToRequest(requestAdapter, mLength);
+ }
}
/**
@@ -330,10 +320,11 @@ final class CronetUploadDataStream implements UploadDataSink {
*/
@VisibleForTesting
long createUploadDataStreamForTesting() throws IOException {
- mUploadDataStreamAdapter = nativeCreateAdapterForTesting();
- mLength = mDataProvider.getLength();
- return nativeCreateUploadDataStreamForTesting(mLength,
- mUploadDataStreamAdapter);
+ synchronized (mLock) {
+ mUploadDataStreamAdapter = nativeCreateAdapterForTesting();
+ mLength = mDataProvider.getLength();
+ return nativeCreateUploadDataStreamForTesting(mLength, mUploadDataStreamAdapter);
+ }
}
@VisibleForTesting

Powered by Google App Engine
This is Rietveld 408576698