summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/providers/downloads/DownloadInfo.java36
-rw-r--r--src/com/android/providers/downloads/DownloadService.java8
-rw-r--r--tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java13
3 files changed, 36 insertions, 21 deletions
diff --git a/src/com/android/providers/downloads/DownloadInfo.java b/src/com/android/providers/downloads/DownloadInfo.java
index 5cd50c9..153e045 100644
--- a/src/com/android/providers/downloads/DownloadInfo.java
+++ b/src/com/android/providers/downloads/DownloadInfo.java
@@ -289,25 +289,23 @@ public class DownloadInfo {
return mTotalBytes <= maxBytesOverMobile;
}
- void startIfReady(long now) {
- if (isReadyToStart(now)) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "Service spawning thread to handle download " + mId);
- }
- if (mHasActiveThread) {
- throw new IllegalStateException("Multiple threads on same download");
- }
- if (mStatus != Impl.STATUS_RUNNING) {
- mStatus = Impl.STATUS_RUNNING;
- ContentValues values = new ContentValues();
- values.put(Impl.COLUMN_STATUS, mStatus);
- mContext.getContentResolver().update(
- ContentUris.withAppendedId(Impl.CONTENT_URI, mId),
- values, null, null);
- }
- DownloadThread downloader = new DownloadThread(mContext, mSystemFacade, this);
- mHasActiveThread = true;
- downloader.start();
+ void start(long now) {
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "Service spawning thread to handle download " + mId);
+ }
+ if (mHasActiveThread) {
+ throw new IllegalStateException("Multiple threads on same download");
+ }
+ if (mStatus != Impl.STATUS_RUNNING) {
+ mStatus = Impl.STATUS_RUNNING;
+ ContentValues values = new ContentValues();
+ values.put(Impl.COLUMN_STATUS, mStatus);
+ mContext.getContentResolver().update(
+ ContentUris.withAppendedId(Impl.CONTENT_URI, mId),
+ values, null, null);
}
+ DownloadThread downloader = new DownloadThread(mContext, mSystemFacade, this);
+ mHasActiveThread = true;
+ downloader.start();
}
}
diff --git a/src/com/android/providers/downloads/DownloadService.java b/src/com/android/providers/downloads/DownloadService.java
index e474d4d..f870954 100644
--- a/src/com/android/providers/downloads/DownloadService.java
+++ b/src/com/android/providers/downloads/DownloadService.java
@@ -614,7 +614,9 @@ public class DownloadService extends Service {
}
}
- info.startIfReady(now);
+ if (info.isReadyToStart(now)) {
+ info.start(now);
+ }
}
/**
@@ -674,7 +676,9 @@ public class DownloadService extends Service {
info.mMediaScanned =
cursor.getInt(cursor.getColumnIndexOrThrow(Constants.MEDIA_SCANNED)) == 1;
- info.startIfReady(now);
+ if (info.isReadyToRestart(now)) {
+ info.start(now);
+ }
}
/**
diff --git a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
index a9810fc..e34c66e 100644
--- a/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
+++ b/tests/src/com/android/providers/downloads/PublicApiFunctionalTest.java
@@ -309,6 +309,19 @@ public class PublicApiFunctionalTest extends AbstractDownloadManagerFunctionalTe
enqueueResponse(HTTP_OK, FILE_CONTENT);
download.runUntilStatus(DownloadManager.STATUS_SUCCESSFUL);
}
+
+ /**
+ * Test for race conditions when the service is flooded with startService() calls while running
+ * a download.
+ */
+ public void testFloodServiceWithStarts() throws Exception {
+ enqueueResponse(HTTP_OK, FILE_CONTENT);
+ Download download = enqueueRequest(getRequest());
+ while (download.getStatus() != DownloadManager.STATUS_SUCCESSFUL) {
+ startService(null);
+ Thread.sleep(10);
+ }
+ }
private DownloadManager.Request getRequest() throws MalformedURLException {
return getRequest(getServerUri(REQUEST_PATH));