6666import java .util .concurrent .LinkedBlockingDeque ;
6767import java .util .concurrent .atomic .AtomicBoolean ;
6868import java .util .concurrent .atomic .AtomicReference ;
69+ import java .util .concurrent .locks .ReentrantLock ;
6970import java .util .function .Supplier ;
7071
7172import 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