Skip to content

Commit 3012b63

Browse files
committed
proper finished queue syncing
1 parent 4b4fb7f commit 3012b63

1 file changed

Lines changed: 57 additions & 26 deletions

File tree

src/main/java/com/falsepattern/falsetweaks/modules/threadedupdates/ThreadedChunkUpdateHelper.java

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import java.util.concurrent.LinkedBlockingDeque;
6767
import java.util.concurrent.atomic.AtomicBoolean;
6868
import java.util.concurrent.atomic.AtomicReference;
69+
import java.util.concurrent.locks.ReentrantLock;
6970
import java.util.function.Supplier;
7071

7172
import static com.falsepattern.falsetweaks.modules.occlusion.OcclusionRenderer.*;
@@ -104,12 +105,19 @@ public void prepare(List<WorldRenderer> worldRenderersToUpdateList, int updateLi
104105
worldRenderersToUpdateListInternal.flip();
105106
back.clear();
106107
val size = front.size();
107-
for (int i = 0; i < size; i++) {
108-
val wr = front.get(i);
109-
val task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
110-
if (!task.inFinishedQueue) {
111-
back.add(wr);
108+
while (!finishedQueueLock.tryLock()) {
109+
Thread.yield();
110+
}
111+
try {
112+
for (int i = 0; i < size; i++) {
113+
val wr = front.get(i);
114+
val task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
115+
if (!task.inFinishedQueue) {
116+
back.add(wr);
117+
}
112118
}
119+
} finally {
120+
finishedQueueLock.unlock();
113121
}
114122
front.clear();
115123
back.addAll(worldRenderersToUpdateList);
@@ -121,18 +129,25 @@ public void prepare(List<WorldRenderer> worldRenderersToUpdateList, int updateLi
121129
public boolean hasNext() {
122130
WorldRenderer wr;
123131

124-
while ((wr = finishedTasks.poll()) != null) {
125-
UpdateTask task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
126-
task.inFinishedQueue = false;
127-
if (task.cancelled || (!wr.needsUpdate && !((WorldRendererOcclusion) wr).ft$needsSort())) {
128-
if (AGGRESSIVE_NEODYMIUM_THREADING) {
129-
NeodymiumCompat.safeDiscardTask(task);
132+
while (!finishedQueueLock.tryLock()) {
133+
Thread.yield();
134+
}
135+
try {
136+
while ((wr = finishedTasks.poll()) != null) {
137+
UpdateTask task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
138+
task.inFinishedQueue = false;
139+
if (task.cancelled || (!wr.needsUpdate && !((WorldRendererOcclusion) wr).ft$needsSort())) {
140+
if (AGGRESSIVE_NEODYMIUM_THREADING) {
141+
NeodymiumCompat.safeDiscardTask(task);
142+
}
143+
task.clear();
144+
} else {
145+
nextRenderer = wr;
146+
return true;
130147
}
131-
task.clear();
132-
} else {
133-
nextRenderer = wr;
134-
return true;
135148
}
149+
} finally {
150+
finishedQueueLock.unlock();
136151
}
137152
return false;
138153
}
@@ -382,17 +397,24 @@ private void updateWorkQueue(List<WorldRenderer> toUpdateList, int updateLimit)
382397
}
383398

384399
private void removeCancelledResults() {
385-
for (Iterator<WorldRenderer> it = finishedTasks.iterator(); it.hasNext(); ) {
386-
WorldRenderer wr = it.next();
387-
UpdateTask task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
388-
if (task.cancelled) {
389-
// Discard results and allow re-schedule on worker thread.
390-
if (AGGRESSIVE_NEODYMIUM_THREADING) {
391-
NeodymiumCompat.safeDiscardTask(task);
400+
while (!finishedQueueLock.tryLock()) {
401+
Thread.yield();
402+
}
403+
try {
404+
for (Iterator<WorldRenderer> it = finishedTasks.iterator(); it.hasNext(); ) {
405+
WorldRenderer wr = it.next();
406+
UpdateTask task = ((IRendererUpdateResultHolder) wr).ft$getRendererUpdateTask();
407+
if (task.cancelled) {
408+
// Discard results and allow re-schedule on worker thread.
409+
if (AGGRESSIVE_NEODYMIUM_THREADING) {
410+
NeodymiumCompat.safeDiscardTask(task);
411+
}
412+
task.clear();
413+
it.remove();
392414
}
393-
task.clear();
394-
it.remove();
395415
}
416+
} finally {
417+
finishedQueueLock.unlock();
396418
}
397419
}
398420

@@ -730,13 +752,22 @@ private void runTask(WorldRenderer wr, Profiler profiler) {
730752
task.clear();
731753
}
732754
((ICapturableTessellator) threadTessellator.get()).discard();
733-
finishedTasks.add(wr);
734-
task.inFinishedQueue = true;
755+
while (!finishedQueueLock.tryLock()) {
756+
Thread.yield();
757+
}
758+
try {
759+
finishedTasks.add(wr);
760+
task.inFinishedQueue = true;
761+
} finally {
762+
finishedQueueLock.unlock();
763+
}
735764
} finally {
736765
profiler.endSection();
737766
}
738767
}
739768

769+
private final ReentrantLock finishedQueueLock = new ReentrantLock();
770+
740771
private class WorkerThread extends FastThreadLocal.TurboThread {
741772
private final AtomicBoolean myRun;
742773
private final CircularTaskQueue taskQueue;

0 commit comments

Comments
 (0)