From 7cf05ed31dde97bc59d668de50fe3fbc5d484d6c Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 23 Jan 2025 19:15:55 -0600 Subject: [PATCH] Fix rare concurrency error on world gen shutdown --- .../GeneratedFullDataSourceProvider.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java index 9c64c3ab8..24559c8da 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java @@ -87,8 +87,20 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im // event listeners // //=================// - public void addWorldGenCompleteListener(IOnWorldGenCompleteListener listener) { this.onWorldGenTaskCompleteListeners.add(listener); } - public void removeWorldGenCompleteListener(IOnWorldGenCompleteListener listener) { this.onWorldGenTaskCompleteListeners.remove(listener); } + public void addWorldGenCompleteListener(IOnWorldGenCompleteListener listener) + { + synchronized (this.onWorldGenTaskCompleteListeners) + { + this.onWorldGenTaskCompleteListeners.add(listener); + } + } + public void removeWorldGenCompleteListener(IOnWorldGenCompleteListener listener) + { + synchronized (this.onWorldGenTaskCompleteListeners) + { + this.onWorldGenTaskCompleteListeners.remove(listener); + } + } @@ -128,10 +140,14 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im // TODO only fire after the section has finished generated or once every X seconds private void fireOnGenPosSuccessListeners(long pos) { - // fire the event listeners - for (IOnWorldGenCompleteListener listener : this.onWorldGenTaskCompleteListeners) + // synchronized to prevent a rare issue where the world generator is being shut down while this listener is firing + synchronized (this.onWorldGenTaskCompleteListeners) { - listener.onWorldGenTaskComplete(pos); + // fire the event listeners + for (IOnWorldGenCompleteListener listener : this.onWorldGenTaskCompleteListeners) + { + listener.onWorldGenTaskComplete(pos); + } } }