diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-09-30 14:26:27 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2013-10-01 09:50:41 -0700 |
commit | 7aa7601c09ab5d87cc15a0ed9a8f511d494a4cbc (patch) | |
tree | a22ca7e432de4309aedf7785babd5e1b73c28b09 /packages/ExternalStorageProvider | |
parent | 7eb5ce03d9697caa2e9caf0437036a937d081e90 (diff) | |
download | frameworks_base-7aa7601c09ab5d87cc15a0ed9a8f511d494a4cbc.zip frameworks_base-7aa7601c09ab5d87cc15a0ed9a8f511d494a4cbc.tar.gz frameworks_base-7aa7601c09ab5d87cc15a0ed9a8f511d494a4cbc.tar.bz2 |
Detect wedged ContentProviders, treat as ANR.
All ContentProvider calls are currently blocking, making it hard for
an app to recover when a remote provider is wedged. This change adds
hidden support to ContentProviderClient to timeout remote calls,
treating them as ANRs. This behavior is disabled by default.
Update DocumentsUI to use a 20 second timeout whenever interacting
with a storage provider.
Bug: 10993301, 10819461, 10852518
Change-Id: I10fa3c425c6a7225fff9cb7a0a07659028230cd3
Diffstat (limited to 'packages/ExternalStorageProvider')
-rw-r--r-- | packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java index 5a15cd2..e9f2c71 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java @@ -54,11 +54,20 @@ import java.lang.ref.WeakReference; public class TestDocumentsProvider extends DocumentsProvider { private static final String TAG = "TestDocuments"; - private static final boolean LAG_ROOTS = false; - private static final boolean CRASH_ROOTS = false; - private static final boolean REFRESH_ROOTS = false; + private static final boolean ROOTS_WEDGE = false; + private static final boolean ROOTS_LAG = false; + private static final boolean ROOTS_CRASH = false; + private static final boolean ROOTS_REFRESH = false; - private static final boolean CRASH_DOCUMENT = false; + private static final boolean DOCUMENT_CRASH = false; + + private static final boolean RECENT_WEDGE = false; + + private static final boolean CHILD_WEDGE = false; + private static final boolean CHILD_CRASH = false; + + private static final boolean THUMB_WEDGE = false; + private static final boolean THUMB_CRASH = false; private static final String MY_ROOT_ID = "myRoot"; private static final String MY_DOC_ID = "myDoc"; @@ -95,10 +104,11 @@ public class TestDocumentsProvider extends DocumentsProvider { public Cursor queryRoots(String[] projection) throws FileNotFoundException { Log.d(TAG, "Someone asked for our roots!"); - if (LAG_ROOTS) SystemClock.sleep(3000); - if (CRASH_ROOTS) System.exit(12); + if (ROOTS_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + if (ROOTS_LAG) SystemClock.sleep(3000); + if (ROOTS_CRASH) System.exit(12); - if (REFRESH_ROOTS) { + if (ROOTS_REFRESH) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { @@ -126,7 +136,7 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public Cursor queryDocument(String documentId, String[] projection) throws FileNotFoundException { - if (CRASH_DOCUMENT) System.exit(12); + if (DOCUMENT_CRASH) System.exit(12); final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection)); includeFile(result, documentId, 0); @@ -198,6 +208,9 @@ public class TestDocumentsProvider extends DocumentsProvider { String parentDocumentId, String[] projection, String sortOrder) throws FileNotFoundException { + if (CHILD_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + if (CHILD_CRASH) System.exit(12); + final ContentResolver resolver = getContext().getContentResolver(); final Uri notifyUri = DocumentsContract.buildDocumentUri( "com.example.documents", parentDocumentId); @@ -257,6 +270,9 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public Cursor queryRecentDocuments(String rootId, String[] projection) throws FileNotFoundException { + + if (RECENT_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + // Pretend to take a super long time to respond SystemClock.sleep(3000); @@ -275,6 +291,10 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public AssetFileDescriptor openDocumentThumbnail( String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException { + + if (THUMB_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + if (THUMB_CRASH) System.exit(12); + final Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); final Paint paint = new Paint(); |