From f1614ec772b6922b707258ba40dbdb240d8de864 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 7 Mar 2025 10:36:44 -0500 Subject: [PATCH] Fix bounded-io thread pool race condition preventing additional thread starts. --- .../signal/core/util/concurrent/SignalExecutors.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/core-util/src/main/java/org/signal/core/util/concurrent/SignalExecutors.java b/core-util/src/main/java/org/signal/core/util/concurrent/SignalExecutors.java index f9d95c6952..38437a0f38 100644 --- a/core-util/src/main/java/org/signal/core/util/concurrent/SignalExecutors.java +++ b/core-util/src/main/java/org/signal/core/util/concurrent/SignalExecutors.java @@ -5,12 +5,12 @@ import android.os.Process; import androidx.annotation.NonNull; -import org.signal.core.util.LinkedBlockingLifoQueue; import org.signal.core.util.ThreadUtil; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -52,7 +52,7 @@ public final class SignalExecutors { maxThreads, timeoutSeconds, TimeUnit.SECONDS, - new LinkedBlockingQueue() { + new SynchronousQueue<>() { @Override public boolean offer(Runnable runnable) { if (isEmpty()) { @@ -74,14 +74,6 @@ public final class SignalExecutors { return threadPool; } - /** - * Returns an executor that prioritizes newer work. This is the opposite of a traditional executor, - * which processor work in FIFO order. - */ - public static ExecutorService newFixedLifoThreadExecutor(String name, int minThreads, int maxThreads) { - return new ThreadPoolExecutor(minThreads, maxThreads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingLifoQueue<>(), new NumberedThreadFactory(name, ThreadUtil.PRIORITY_BACKGROUND_THREAD)); - } - public static HandlerThread getAndStartHandlerThread(@NonNull String name, int priority) { HandlerThread handlerThread = new HandlerThread(name, priority); handlerThread.start();