diff options
author | Ray Chen <raychen@google.com> | 2012-04-20 10:58:20 +0800 |
---|---|---|
committer | Ray Chen <raychen@google.com> | 2012-04-20 11:43:12 +0800 |
commit | f9a5a456aa75949c1065656ba01ab2ca350de7e9 (patch) | |
tree | da862afa49b68495b1b6f9e8b498c25bb17b16db /src/com/android/gallery3d/app/GalleryAppImpl.java | |
parent | 0f4f00b1c311527f31afa2d7a481b46675aeb14e (diff) | |
download | android_packages_apps_Snap-f9a5a456aa75949c1065656ba01ab2ca350de7e9.tar.gz android_packages_apps_Snap-f9a5a456aa75949c1065656ba01ab2ca350de7e9.tar.bz2 android_packages_apps_Snap-f9a5a456aa75949c1065656ba01ab2ca350de7e9.zip |
Fix 6208468 21 ANR(s) in: com.google.android.gallery3d on crespo during monkey runs for JRM80
b:6208468
Both getDataManager and getImageCacheService use the same lock but the latter method is blocked on
RandomAccessFile's open syscall. The lock should be separated because they're independent and
getDataManager is very frequently used too.
Change-Id: I4d44cfc949f45a31c7200c8327115bc4b7fde60f
Diffstat (limited to 'src/com/android/gallery3d/app/GalleryAppImpl.java')
-rw-r--r-- | src/com/android/gallery3d/app/GalleryAppImpl.java | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/com/android/gallery3d/app/GalleryAppImpl.java b/src/com/android/gallery3d/app/GalleryAppImpl.java index ac551dd95..852926bc7 100644 --- a/src/com/android/gallery3d/app/GalleryAppImpl.java +++ b/src/com/android/gallery3d/app/GalleryAppImpl.java @@ -35,6 +35,7 @@ public class GalleryAppImpl extends Application implements GalleryApp { private static final long DOWNLOAD_CAPACITY = 64 * 1024 * 1024; // 64M private ImageCacheService mImageCacheService; + private Object mLock = new Object(); private DataManager mDataManager; private ThreadPool mThreadPool; private DownloadCache mDownloadCache; @@ -60,11 +61,14 @@ public class GalleryAppImpl extends Application implements GalleryApp { return mDataManager; } - public synchronized ImageCacheService getImageCacheService() { - if (mImageCacheService == null) { - mImageCacheService = new ImageCacheService(getAndroidContext()); + public ImageCacheService getImageCacheService() { + // This method may block on file I/O so a dedicated lock is needed here. + synchronized (mLock) { + if (mImageCacheService == null) { + mImageCacheService = new ImageCacheService(getAndroidContext()); + } + return mImageCacheService; } - return mImageCacheService; } public synchronized ThreadPool getThreadPool() { |