Skip to content

Commit 5772290

Browse files
authored
Avoid ThreadLocal lookup in ParallelQueueExtent (#3096)
* Avoid ThreadLocal lookup in ParallelQueueExtent * restore public methods
1 parent 2b31428 commit 5772290

File tree

4 files changed

+63
-10
lines changed

4 files changed

+63
-10
lines changed

worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fastasyncworldedit.core.queue.Filter;
2020
import com.fastasyncworldedit.core.queue.IQueueChunk;
2121
import com.fastasyncworldedit.core.queue.IQueueExtent;
22+
import com.fastasyncworldedit.core.util.task.FaweThread;
2223
import com.sk89q.worldedit.MaxChangedBlocksException;
2324
import com.sk89q.worldedit.WorldEditException;
2425
import com.sk89q.worldedit.extent.Extent;
@@ -53,7 +54,6 @@
5354
public class ParallelQueueExtent extends PassthroughExtent {
5455

5556
private static final Logger LOGGER = LogManagerCompat.getLogger();
56-
private static final ThreadLocal<Extent> extents = new ThreadLocal<>();
5757

5858
private final World world;
5959
private final QueueHandler handler;
@@ -87,29 +87,31 @@ public ParallelQueueExtent(QueueHandler handler, World world, boolean fastmode,
8787
/**
8888
* Removes the extent currently associated with the calling thread.
8989
*/
90+
@Deprecated(forRemoval = true, since = "TODO")
9091
public static void clearCurrentExtent() {
91-
extents.remove();
92+
FaweThread.clearCurrentExtent();
9293
}
9394

9495
/**
9596
* Sets the extent associated with the calling thread.
9697
*/
98+
@Deprecated(forRemoval = true, since = "TODO")
9799
public static void setCurrentExtent(Extent extent) {
98-
extents.set(extent);
100+
FaweThread.setCurrentExtent(extent);
99101
}
100102

101103
private void enter(Extent extent) {
102-
setCurrentExtent(extent);
104+
FaweThread.setCurrentExtent(extent);
103105
}
104106

105107
private void exit() {
106-
clearCurrentExtent();
108+
FaweThread.clearCurrentExtent();
107109
}
108110

109111
@Override
110112
@SuppressWarnings({"unchecked", "rawtypes"})
111113
public IQueueExtent<IQueueChunk> getExtent() {
112-
Extent extent = extents.get();
114+
Extent extent = FaweThread.getCurrentExtent();
113115
if (extent == null) {
114116
extent = super.getExtent();
115117
}

worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import com.fastasyncworldedit.core.queue.IChunkSet;
1111
import com.fastasyncworldedit.core.queue.IQueueChunk;
1212
import com.fastasyncworldedit.core.queue.IQueueExtent;
13-
import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent;
1413
import com.fastasyncworldedit.core.util.MemUtil;
1514
import com.sk89q.worldedit.entity.Entity;
15+
import com.fastasyncworldedit.core.util.task.FaweThread;
1616
import com.sk89q.worldedit.internal.util.LogManagerCompat;
1717
import com.sk89q.worldedit.math.BlockVector3;
1818
import com.sk89q.worldedit.regions.Region;
@@ -1056,11 +1056,11 @@ public <U extends Future<U>> U call(IQueueExtent<? extends IChunk> owner, IChunk
10561056
// This way, locking is spread across multiple STQEs, allowing for better performance
10571057

10581058
private void trackExtent() {
1059-
ParallelQueueExtent.setCurrentExtent(extent);
1059+
FaweThread.setCurrentExtent(extent);
10601060
}
10611061

10621062
private void untrackExtent() {
1063-
ParallelQueueExtent.clearCurrentExtent();
1063+
FaweThread.clearCurrentExtent();
10641064
}
10651065

10661066
/**

worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/FaweForkJoinWorkerThreadFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public FaweForkJoinWorkerThreadFactory(String nameFormat) {
1616

1717
@Override
1818
public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
19-
final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
19+
final ForkJoinWorkerThread worker = new FaweThread(pool);
2020
worker.setName(String.format(nameFormat, idCounter.getAndIncrement()));
2121
return worker;
2222
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fastasyncworldedit.core.util.task;
2+
3+
import com.sk89q.worldedit.extent.Extent;
4+
import org.jetbrains.annotations.ApiStatus;
5+
6+
import java.util.concurrent.ForkJoinPool;
7+
import java.util.concurrent.ForkJoinWorkerThread;
8+
9+
@ApiStatus.Internal
10+
public class FaweThread extends ForkJoinWorkerThread {
11+
12+
private static final ThreadLocal<Extent> EXTENTS = new ThreadLocal<>();
13+
14+
private Extent currentExtent;
15+
16+
protected FaweThread(final ForkJoinPool pool) {
17+
super(null, pool, true);
18+
}
19+
20+
/**
21+
* Removes the extent currently associated with the calling thread.
22+
*/
23+
public static void clearCurrentExtent() {
24+
if (Thread.currentThread() instanceof FaweThread ft) {
25+
ft.currentExtent = null;
26+
} else {
27+
EXTENTS.remove();
28+
}
29+
}
30+
31+
/**
32+
* Sets the extent associated with the calling thread.
33+
*/
34+
public static void setCurrentExtent(Extent extent) {
35+
if (Thread.currentThread() instanceof FaweThread ft) {
36+
ft.currentExtent = extent;
37+
} else {
38+
EXTENTS.set(extent);
39+
}
40+
41+
}
42+
43+
public static Extent getCurrentExtent() {
44+
if (Thread.currentThread() instanceof FaweThread ft) {
45+
return ft.currentExtent;
46+
} else {
47+
return EXTENTS.get();
48+
}
49+
}
50+
51+
}

0 commit comments

Comments
 (0)