From ab00782e93c7ee784a7fa47556e9147627fc3b05 Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 28 Aug 2024 11:18:11 -0400 Subject: [PATCH] wait on threads to join in engine shutdown --- docs/src/progress/renderertodo.md | 3 +++ src/main/java/electrosphere/engine/Main.java | 4 ++-- .../java/electrosphere/engine/threads/ThreadManager.java | 8 ++++++++ src/main/java/electrosphere/net/server/Server.java | 2 +- src/main/java/electrosphere/renderer/RenderingEngine.java | 2 +- src/test/java/template/extensions/RenderingExtension.java | 1 + src/test/java/testutils/TestEngineUtils.java | 2 +- 7 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index e805c43c..8f8e4b22 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -635,6 +635,9 @@ Quitting to main menu Server utilities provided to scripting engine Spawn player character with weapon when testing levels +(08/26/2024) +Automated testing fixes + # TODO diff --git a/src/main/java/electrosphere/engine/Main.java b/src/main/java/electrosphere/engine/Main.java index 203212cb..5d79cae2 100644 --- a/src/main/java/electrosphere/engine/Main.java +++ b/src/main/java/electrosphere/engine/Main.java @@ -432,10 +432,10 @@ public class Main { if(!Globals.HEADLESS && Globals.RUN_CLIENT){ glfwTerminate(); } - //reset globals - Globals.resetGlobals(); //used to signal threads to stop Globals.threadManager.close(); + //reset globals for good measure (making sure no long-running threads can re-inject entities into scenes) + Globals.resetGlobals(); //shut down audio engine if(!Globals.HEADLESS && Globals.RUN_CLIENT && Globals.RUN_AUDIO && Globals.audioEngine != null && Globals.audioEngine.initialized()){ Globals.audioEngine.shutdown(); diff --git a/src/main/java/electrosphere/engine/threads/ThreadManager.java b/src/main/java/electrosphere/engine/threads/ThreadManager.java index b07d02be..5f7e74b0 100644 --- a/src/main/java/electrosphere/engine/threads/ThreadManager.java +++ b/src/main/java/electrosphere/engine/threads/ThreadManager.java @@ -99,6 +99,14 @@ public class ThreadManager { for(int i = 0; i < 3; i++){ for(LabeledThread thread : activeThreads){ thread.getThread().interrupt(); + try { + thread.getThread().join(10); + if(thread.getThread().isAlive()){ + throw new IllegalStateException("Failed to interrupt thread! " + thread.getLabel()); + } + } catch (InterruptedException e) { + CodeUtils.todo(e, "Think about how to handle this"); + } } try { TimeUnit.MILLISECONDS.sleep(3); diff --git a/src/main/java/electrosphere/net/server/Server.java b/src/main/java/electrosphere/net/server/Server.java index a0924338..fb44d7c3 100644 --- a/src/main/java/electrosphere/net/server/Server.java +++ b/src/main/java/electrosphere/net/server/Server.java @@ -173,7 +173,7 @@ public class Server implements Runnable { for(ServerConnectionHandler connection : this.connectionsToCleanup){ //tell all clients to destroy the entity Player player = connection.getPlayer(); - if(player != null){ + if(player != null && player.getPlayerEntity() != null){ ServerEntityUtils.destroyEntity(player.getPlayerEntity()); } this.activeConnections.remove(connection); diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java index 6b5b566e..19edb00b 100644 --- a/src/main/java/electrosphere/renderer/RenderingEngine.java +++ b/src/main/java/electrosphere/renderer/RenderingEngine.java @@ -655,7 +655,7 @@ public class RenderingEngine { public void checkError(){ int error = this.getError(); if(error != GL11.GL_NO_ERROR){ - // LoggerInterface.loggerRenderer.ERROR("checkError - " + getErrorInEnglish(error), new IllegalStateException("OpenGL Error")); + LoggerInterface.loggerRenderer.ERROR("checkError - " + getErrorInEnglish(error), new IllegalStateException("OpenGL Error")); } } diff --git a/src/test/java/template/extensions/RenderingExtension.java b/src/test/java/template/extensions/RenderingExtension.java index 5bac1da6..f066a9bd 100644 --- a/src/test/java/template/extensions/RenderingExtension.java +++ b/src/test/java/template/extensions/RenderingExtension.java @@ -17,6 +17,7 @@ public class RenderingExtension implements BeforeEachCallback, AfterEachCallback public void beforeEach(ExtensionContext context) throws Exception { Globals.WINDOW_DECORATED = false; Globals.WINDOW_FULLSCREEN = true; + Globals.RUN_AUDIO = false; Globals.WINDOW_WIDTH = 1920; Globals.WINDOW_HEIGHT = 1080; TestEngineUtils.initGraphicalEngine(); diff --git a/src/test/java/testutils/TestEngineUtils.java b/src/test/java/testutils/TestEngineUtils.java index c5d5d926..5d6d3cd8 100644 --- a/src/test/java/testutils/TestEngineUtils.java +++ b/src/test/java/testutils/TestEngineUtils.java @@ -29,7 +29,7 @@ public class TestEngineUtils { public static void initGraphicalEngine(){ Globals.RUN_CLIENT = true; Globals.RUN_SERVER = true; - Globals.RUN_AUDIO = true; + Globals.RUN_AUDIO = false; Globals.HEADLESS = false; Profiler.PROFILE = false; NetUtils.setPort(0);