diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 224fa306..3769b0d1 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1190,6 +1190,8 @@ Fluid spawning item Fix fluid shader Re-enable fluid simulation Remove concurrent datastructure usage in cell management +Auto close prepared queries that are iterated over +Fix viewport loading # TODO diff --git a/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java b/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java index 21f65feb..8cdbf557 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/ClientLoading.java @@ -70,6 +70,7 @@ public class ClientLoading { ClientLoading.initClientThread(); } //while we don't know what races are playable, wait + WindowUtils.updateLoadingWindow("Waiting on lore"); while(Globals.gameConfigCurrent.getCreatureTypeLoader().getPlayableRaces().size() == 0){ try { TimeUnit.MILLISECONDS.sleep(5); diff --git a/src/main/java/electrosphere/engine/threads/ThreadManager.java b/src/main/java/electrosphere/engine/threads/ThreadManager.java index 5ef976fb..a22f767f 100644 --- a/src/main/java/electrosphere/engine/threads/ThreadManager.java +++ b/src/main/java/electrosphere/engine/threads/ThreadManager.java @@ -145,7 +145,7 @@ public class ThreadManager { if(thread.getThread().isAlive()){ String errorMessage = "Failed to interrupt thread! " + thread.getLabel(); System.err.println(errorMessage); - throw new IllegalStateException(); + throw new Error(errorMessage); } } catch (InterruptedException e) { CodeUtils.todo(e, "Think about how to handle this"); diff --git a/src/main/java/electrosphere/game/data/creature/type/CreatureTypeLoader.java b/src/main/java/electrosphere/game/data/creature/type/CreatureTypeLoader.java index 710fd177..28f873dd 100644 --- a/src/main/java/electrosphere/game/data/creature/type/CreatureTypeLoader.java +++ b/src/main/java/electrosphere/game/data/creature/type/CreatureTypeLoader.java @@ -6,7 +6,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.Semaphore; +import java.util.concurrent.locks.ReentrantLock; /** * The creature type loader @@ -26,7 +26,7 @@ public class CreatureTypeLoader { /** * The lock on playable races */ - Semaphore playableRaceLock = new Semaphore(1); + ReentrantLock lock = new ReentrantLock(); /** * Adds a playable race to the loader @@ -42,9 +42,9 @@ public class CreatureTypeLoader { */ public List getPlayableRaces(){ List races = null; - playableRaceLock.acquireUninterruptibly(); + lock.lock(); races = playableRaceNames; - playableRaceLock.release(); + lock.unlock(); return races; } @@ -60,9 +60,9 @@ public class CreatureTypeLoader { * @param races The list of playable races */ public void loadPlayableRaces(List races){ - playableRaceLock.acquireUninterruptibly(); + lock.lock(); playableRaceNames = races; - playableRaceLock.release(); + lock.unlock(); } /** diff --git a/src/main/java/electrosphere/server/db/DatabaseController.java b/src/main/java/electrosphere/server/db/DatabaseController.java index 5dd4cea2..6b3f4a9c 100644 --- a/src/main/java/electrosphere/server/db/DatabaseController.java +++ b/src/main/java/electrosphere/server/db/DatabaseController.java @@ -66,7 +66,9 @@ public class DatabaseController { argumentIndex++; } //actually execute - return statement.execute(); + boolean result = statement.execute(); + statement.close(); + return result; } catch (SQLException ex) { LoggerInterface.loggerFileIO.ERROR("SQL query execution error", ex); } @@ -81,6 +83,10 @@ public class DatabaseController { */ public DatabaseResult executePreparedQuery(String statementRaw, Object...arguments){ DatabaseResult rVal = DatabaseResult.createQuery(statementRaw); + if(conn == null){ + rVal.succeeded = false; + return rVal; + } try { PreparedStatement statement = conn.prepareStatement(statementRaw); @@ -137,7 +143,9 @@ public class DatabaseController { */ public void disconnect(){ try { - conn.close(); + if(this.conn != null){ + conn.close(); + } } catch (SQLException ex) { LoggerInterface.loggerEngine.ERROR("Error disconnecting from DB", ex); } diff --git a/src/main/java/electrosphere/server/db/DatabaseResultIterator.java b/src/main/java/electrosphere/server/db/DatabaseResultIterator.java index de02d37b..f243b663 100644 --- a/src/main/java/electrosphere/server/db/DatabaseResultIterator.java +++ b/src/main/java/electrosphere/server/db/DatabaseResultIterator.java @@ -65,7 +65,11 @@ public class DatabaseResultIterator implements Iterator { @Override public boolean hasNext() { try { - return !rs.isAfterLast(); + boolean rVal = !rs.isAfterLast(); + if(!rVal && rs != null){ + rs.close(); + } + return rVal; } catch (SQLException e) { LoggerInterface.loggerEngine.ERROR("Critical failure in DatabaseResultIterator", e); return false; diff --git a/src/test/java/electrosphere/test/testutils/TestEngineUtils.java b/src/test/java/electrosphere/test/testutils/TestEngineUtils.java index 4f7b3381..65391976 100644 --- a/src/test/java/electrosphere/test/testutils/TestEngineUtils.java +++ b/src/test/java/electrosphere/test/testutils/TestEngineUtils.java @@ -110,7 +110,7 @@ public class TestEngineUtils { for(LoadingThread thread : Globals.threadManager.getLoadingThreads()){ errorMessage = errorMessage + thread.getType() + "\n"; } - Assertions.fail("Failed to startup"); + Assertions.fail(errorMessage); } }