Bug 1300543 - IconRequestExecutor: Add custom thread pool executor and thread factory. r?ahunt
The custom executor behaves like the one returned by Executors.newSingleThreadExecutor().
However the created thread will have a unique name ("GeckoIconTask") and this will make
tracing the thread much easier.
MozReview-Commit-ID: 7y0EMGmNLkG
--- a/mobile/android/base/java/org/mozilla/gecko/icons/IconRequestExecutor.java
+++ b/mobile/android/base/java/org/mozilla/gecko/icons/IconRequestExecutor.java
@@ -1,43 +1,47 @@
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.icons;
+import android.support.annotation.NonNull;
+
import org.mozilla.gecko.icons.loader.ContentProviderLoader;
import org.mozilla.gecko.icons.loader.DataUriLoader;
+import org.mozilla.gecko.icons.loader.DiskLoader;
import org.mozilla.gecko.icons.loader.IconDownloader;
import org.mozilla.gecko.icons.loader.IconGenerator;
+import org.mozilla.gecko.icons.loader.IconLoader;
import org.mozilla.gecko.icons.loader.JarLoader;
import org.mozilla.gecko.icons.loader.LegacyLoader;
-import org.mozilla.gecko.icons.loader.IconLoader;
import org.mozilla.gecko.icons.loader.MemoryLoader;
-import org.mozilla.gecko.icons.loader.DiskLoader;
import org.mozilla.gecko.icons.preparation.AboutPagesPreparer;
import org.mozilla.gecko.icons.preparation.AddDefaultIconUrl;
import org.mozilla.gecko.icons.preparation.FilterKnownFailureUrls;
import org.mozilla.gecko.icons.preparation.FilterMimeTypes;
import org.mozilla.gecko.icons.preparation.FilterPrivilegedUrls;
import org.mozilla.gecko.icons.preparation.LookupIconUrl;
import org.mozilla.gecko.icons.preparation.Preparer;
import org.mozilla.gecko.icons.processing.ColorProcessor;
+import org.mozilla.gecko.icons.processing.DiskProcessor;
import org.mozilla.gecko.icons.processing.MemoryProcessor;
import org.mozilla.gecko.icons.processing.Processor;
import org.mozilla.gecko.icons.processing.ResizingProcessor;
-import org.mozilla.gecko.icons.processing.DiskProcessor;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
/**
* Executor for icon requests.
*/
/* package-private */ class IconRequestExecutor {
/**
* Loader implementation that generates an icon if none could be loaded.
*/
@@ -110,17 +114,37 @@ import java.util.concurrent.Future;
// Resize the icon to match the target size (if possible)
new ResizingProcessor(),
// Store the icon in the memory cache
new MemoryProcessor()
);
- private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();
+ private static final ExecutorService EXECUTOR;
+ static {
+ final ThreadFactory factory = new ThreadFactory() {
+ @Override
+ public Thread newThread(@NonNull Runnable runnable) {
+ Thread thread = new Thread(runnable, "GeckoIconTask");
+ thread.setDaemon(false);
+ thread.setPriority(Thread.NORM_PRIORITY);
+ return thread;
+ }
+ };
+
+ // Single thread executor
+ EXECUTOR = new ThreadPoolExecutor(
+ 1, /* corePoolSize */
+ 1, /* maximumPoolSize */
+ 0L, /* keepAliveTime */
+ TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<Runnable>(),
+ factory);
+ }
/**
* Submit the request for execution.
*/
/* package-private */ static Future<IconResponse> submit(IconRequest request) {
return EXECUTOR.submit(
new IconTask(request, PREPARERS, LOADERS, PROCESSORS, GENERATOR)
);