From dc3bf2ecb8aee8471d994a316c077d17950191d8 Mon Sep 17 00:00:00 2001 From: Chris Kitching Date: Thu, 12 Sep 2013 10:50:03 -0400 Subject: [PATCH] Bug 888326 - Part 4: LoadFaviconTask's use mNextFaviconLoadId is now thread safe. (Use AtomicInteger instead of long.) r=mleibovic --- mobile/android/base/BrowserApp.java | 4 ++-- mobile/android/base/Tab.java | 6 +++--- mobile/android/base/favicons/Favicons.java | 18 +++++++++--------- .../android/base/favicons/LoadFaviconTask.java | 11 +++++------ 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 66cb37da467b..f119863243d3 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -1335,7 +1335,7 @@ abstract public class BrowserApp extends GeckoApp maybeCancelFaviconLoad(tab); int flags = LoadFaviconTask.FLAG_SCALE | ( (tab.isPrivate() || tab.getErrorType() != Tab.ErrorType.NONE) ? 0 : LoadFaviconTask.FLAG_PERSIST); - long id = Favicons.loadFavicon(tab.getURL(), tab.getFaviconURL(), flags, + int id = Favicons.loadFavicon(tab.getURL(), tab.getFaviconURL(), flags, new OnFaviconLoadedListener() { @Override @@ -1361,7 +1361,7 @@ abstract public class BrowserApp extends GeckoApp } private void maybeCancelFaviconLoad(Tab tab) { - long faviconLoadId = tab.getFaviconLoadId(); + int faviconLoadId = tab.getFaviconLoadId(); if (faviconLoadId == Favicons.NOT_LOADING) return; diff --git a/mobile/android/base/Tab.java b/mobile/android/base/Tab.java index 5b9c7f8494e0..2f8499b83677 100644 --- a/mobile/android/base/Tab.java +++ b/mobile/android/base/Tab.java @@ -54,7 +54,7 @@ public class Tab { private boolean mExternal; private boolean mBookmark; private boolean mReadingListItem; - private long mFaviconLoadId; + private int mFaviconLoadId; private String mContentType; private boolean mHasTouchListeners; private ZoomConstraints mZoomConstraints; @@ -351,11 +351,11 @@ public class Tab { return mHasTouchListeners; } - public void setFaviconLoadId(long faviconLoadId) { + public void setFaviconLoadId(int faviconLoadId) { mFaviconLoadId = faviconLoadId; } - public long getFaviconLoadId() { + public int getFaviconLoadId() { return mFaviconLoadId; } diff --git a/mobile/android/base/favicons/Favicons.java b/mobile/android/base/favicons/Favicons.java index a8abb04e7ac4..e8d66d593cab 100644 --- a/mobile/android/base/favicons/Favicons.java +++ b/mobile/android/base/favicons/Favicons.java @@ -24,8 +24,8 @@ import java.util.Set; public class Favicons { private static final String LOGTAG = "GeckoFavicons"; - public static final long NOT_LOADING = 0; - public static final long FAILED_EXPIRY_NEVER = -1; + public static final int NOT_LOADING = 0; + public static final int FAILED_EXPIRY_NEVER = -1; public static final int FLAG_PERSIST = 1; public static final int FLAG_SCALE = 2; @@ -34,7 +34,7 @@ public class Favicons { protected static Context sContext; - private static final Map sLoadTasks = Collections.synchronizedMap(new HashMap()); + private static final Map sLoadTasks = Collections.synchronizedMap(new HashMap()); private static final LruCache sFaviconCache = new LruCache(1024 * 1024) { @Override protected int sizeOf(String url, Bitmap image) { @@ -68,7 +68,7 @@ public class Favicons { return BrowserDB.getFaviconUrlForHistoryUrl(sContext.getContentResolver(), pageUrl); } - public static long loadFavicon(String pageUrl, String faviconUrl, int flags, + public static int loadFavicon(String pageUrl, String faviconUrl, int flags, OnFaviconLoadedListener listener) { // Handle the case where page url is empty @@ -92,7 +92,7 @@ public class Favicons { LoadFaviconTask task = new LoadFaviconTask(ThreadUtils.getBackgroundHandler(), pageUrl, faviconUrl, flags, listener); - long taskId = task.getmId(); + int taskId = task.getId(); sLoadTasks.put(taskId, task); task.execute(); @@ -134,7 +134,7 @@ public class Favicons { sFailedCache.evictAll(); } - public static boolean cancelFaviconLoad(long taskId) { + public static boolean cancelFaviconLoad(int taskId) { Log.d(LOGTAG, "Requesting cancelation of favicon load (" + taskId + ")"); boolean cancelled = false; @@ -155,10 +155,10 @@ public class Favicons { // Cancel any pending tasks synchronized (sLoadTasks) { - Set taskIds = sLoadTasks.keySet(); - Iterator iter = taskIds.iterator(); + Set taskIds = sLoadTasks.keySet(); + Iterator iter = taskIds.iterator(); while (iter.hasNext()) { - long taskId = iter.next(); + int taskId = iter.next(); cancelFaviconLoad(taskId); } } diff --git a/mobile/android/base/favicons/LoadFaviconTask.java b/mobile/android/base/favicons/LoadFaviconTask.java index 23ef3a763333..119a306c1a99 100644 --- a/mobile/android/base/favicons/LoadFaviconTask.java +++ b/mobile/android/base/favicons/LoadFaviconTask.java @@ -26,6 +26,7 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.util.concurrent.atomic.AtomicInteger; /** * Class representing the asynchronous task to load a Favicon which is not currently in the in-memory @@ -39,8 +40,8 @@ public class LoadFaviconTask extends UiAsyncTask { public static final int FLAG_PERSIST = 1; public static final int FLAG_SCALE = 2; - private long mNextFaviconLoadId; - private long mId; + private static AtomicInteger mNextFaviconLoadId = new AtomicInteger(0); + private int mId; private String mPageUrl; private String mFaviconUrl; private OnFaviconLoadedListener mListener; @@ -53,9 +54,7 @@ public class LoadFaviconTask extends UiAsyncTask { OnFaviconLoadedListener aListener) { super(backgroundThreadHandler); - synchronized(this) { - mId = ++mNextFaviconLoadId; - } + mId = mNextFaviconLoadId.incrementAndGet(); mPageUrl = aPageUrl; mFaviconUrl = aFaviconUrl; @@ -201,7 +200,7 @@ public class LoadFaviconTask extends UiAsyncTask { // favicon load is cancelled. } - long getId() { + int getId() { return mId; }