Skip to content

Commit bdc3fe0

Browse files
committed
Trampoline#forkAll optimisation
1 parent 25d0396 commit bdc3fe0

File tree

6 files changed

+21
-23
lines changed

6 files changed

+21
-23
lines changed

tasks-jvm/src/main/java/org/funfix/tasks/jvm/DelayedFun.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import org.jspecify.annotations.Nullable;
44

5-
import java.util.concurrent.Delayed;
65
/**
76
* Represents a delayed computation (a thunk).
87
* <p>

tasks-jvm/src/main/java/org/funfix/tasks/jvm/Task.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,8 @@ private T awaitInline(final Cancellable cancelToken, final AwaitFunction await)
518518
} catch (final TimeoutException | InterruptedException e) {
519519
if (!isCancelled) {
520520
isCancelled = true;
521-
if (e instanceof TimeoutException)
522-
timedOut = (TimeoutException) e;
521+
if (e instanceof TimeoutException te)
522+
timedOut = te;
523523
cancelToken.cancel();
524524
}
525525
}

tasks-jvm/src/main/java/org/funfix/tasks/jvm/TaskExecutor.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ final class TaskLocalContext {
2323
static void signalTheStartOfBlockingCall() {
2424
// clears the trampoline first
2525
final var executor = localExecutor.get();
26-
Trampoline.forkAll(executor);
26+
Trampoline.forkAll(
27+
executor != null ? executor : TaskExecutors.sharedBlockingIO()
28+
);
2729
}
2830

2931
static boolean isCurrentExecutor(final TaskExecutor executor) {
@@ -64,7 +66,7 @@ public void execute(final Runnable command) {
6466
@Override
6567
public void resumeOnExecutor(final Runnable runnable) {
6668
if (TaskLocalContext.isCurrentExecutor(this)) {
67-
Trampoline.INSTANCE.execute(runnable);
69+
Trampoline.execute(runnable);
6870
} else {
6971
execute(runnable);
7072
}

tasks-jvm/src/main/java/org/funfix/tasks/jvm/TaskExecutors.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private static Executor sharedVirtualIO() {
7676
* On Java 21 and above, the created {@code Executor} will run tasks on virtual threads.
7777
* On older JVM versions, it returns a plain {@code Executors.newCachedThreadPool}.
7878
*/
79-
@SuppressWarnings("deprecation")
79+
@SuppressWarnings({"deprecation", "EmptyCatch"})
8080
public static ExecutorService unlimitedThreadPoolForIO(final String prefix) {
8181
if (VirtualThreads.areVirtualThreadsSupported())
8282
try {

tasks-jvm/src/main/java/org/funfix/tasks/jvm/Trampoline.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import org.jetbrains.annotations.ApiStatus;
44
import org.jspecify.annotations.Nullable;
55

6-
import java.util.LinkedList;
6+
import java.util.ArrayDeque;
77
import java.util.concurrent.Executor;
88

99
/**
@@ -17,7 +17,7 @@
1717
final class Trampoline {
1818
private Trampoline() {}
1919

20-
private static final ThreadLocal<@Nullable LinkedList<Runnable>> queue =
20+
private static final ThreadLocal<@Nullable ArrayDeque<Runnable>> queue =
2121
new ThreadLocal<>();
2222

2323
private static void eventLoop() {
@@ -49,7 +49,7 @@ public void resumeOnExecutor(Runnable runnable) {
4949
public void execute(Runnable command) {
5050
var current = queue.get();
5151
if (current == null) {
52-
current = new LinkedList<>();
52+
current = new ArrayDeque<>();
5353
current.add(command);
5454
queue.set(current);
5555
try {
@@ -63,20 +63,17 @@ public void execute(Runnable command) {
6363
}
6464
};
6565

66-
public static void forkAll(final @Nullable Executor executor) {
66+
public static void forkAll(final Executor executor) {
6767
final var current = queue.get();
68-
while (current != null && !current.isEmpty()) {
69-
final var next = current.pollFirst();
70-
if (executor != null) {
71-
executor.execute(next);
72-
} else {
73-
try {
74-
next.run();
75-
} catch (final Throwable e) {
76-
UncaughtExceptionHandler.logOrRethrow(e);
77-
}
68+
if (current == null) return;
69+
70+
final var copy = new ArrayDeque<>(current);
71+
executor.execute(() -> Trampoline.execute(() -> {
72+
while (!copy.isEmpty()) {
73+
final var next = copy.pollFirst();
74+
Trampoline.execute(next);
7875
}
79-
}
76+
}));
8077
}
8178

8279
public static void execute(final Runnable command) {

tasks-jvm/src/main/java/org/funfix/tasks/jvm/UncaughtExceptionHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public static void rethrowIfFatal(final Throwable e) {
1010
// the process
1111
return;
1212
}
13-
if (e instanceof Error) {
14-
throw (Error) e;
13+
if (e instanceof Error error) {
14+
throw error;
1515
}
1616
}
1717

0 commit comments

Comments
 (0)