From 94f0b4c3e4d8e2bf075ce0d0146c6399b1f49f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Wed, 9 Apr 2014 01:45:16 +0200 Subject: [PATCH] Fixed concurrency issue with loading queue in main loop. --- .../gamecore/audio/DeferredAudio.java | 2 +- src/mightypork/gamecore/control/BaseApp.java | 5 +-- .../gamecore/loading/AsyncResourceLoader.java | 42 +++++++++---------- .../loading/BaseDeferredResource.java | 6 ++- .../gamecore/render/fonts/DeferredFont.java | 2 +- .../render/textures/DeferredTexture.java | 2 +- src/mightypork/utils/logging/LogInstance.java | 2 +- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/mightypork/gamecore/audio/DeferredAudio.java b/src/mightypork/gamecore/audio/DeferredAudio.java index d605b06..c7dbcb0 100644 --- a/src/mightypork/gamecore/audio/DeferredAudio.java +++ b/src/mightypork/gamecore/audio/DeferredAudio.java @@ -86,7 +86,7 @@ public class DeferredAudio extends BaseDeferredResource { @Override - protected void loadResource(String resource) throws IOException + protected synchronized final void loadResource(String resource) throws IOException { final String ext = FileUtils.getExtension(resource); diff --git a/src/mightypork/gamecore/control/BaseApp.java b/src/mightypork/gamecore/control/BaseApp.java index 505acd0..aef0820 100644 --- a/src/mightypork/gamecore/control/BaseApp.java +++ b/src/mightypork/gamecore/control/BaseApp.java @@ -43,7 +43,6 @@ public abstract class BaseApp implements AppAccess { */ public void start() { - Log.i("Commencing initialization sequence..."); initialize(); @@ -70,7 +69,7 @@ public abstract class BaseApp implements AppAccess { org.newdawn.slick.util.Log.setLogSystem(new SlickLogRedirector(log)); // only here it makes sense to log. - Log.f1("Initializing subsystems..."); + Log.i("=== Commencing initialization sequence ==="); /* * Event bus @@ -128,7 +127,7 @@ public abstract class BaseApp implements AppAccess { initScreens(screenRegistry); postInit(); - Log.i("Initialized sequence completed."); + Log.i("=== Initialized sequence completed ==="); } diff --git a/src/mightypork/gamecore/loading/AsyncResourceLoader.java b/src/mightypork/gamecore/loading/AsyncResourceLoader.java index a588f62..e5f3a7f 100644 --- a/src/mightypork/gamecore/loading/AsyncResourceLoader.java +++ b/src/mightypork/gamecore/loading/AsyncResourceLoader.java @@ -39,8 +39,28 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L @Override - public void loadResource(DeferredResource resource) + public void loadResource(final DeferredResource resource) { + if (resource.isLoaded()) return; + if (resource instanceof NullResource) return; + + // textures & fonts needs to be loaded in main thread + if (resource.getClass().isAnnotationPresent(MustLoadInMainThread.class)) { + + Log.f3(" Delegating to main thread:\n " + Log.str(resource)); + + app.getEventBus().send(new MainLoopTaskRequest(new Runnable() { + + @Override + public void run() + { + resource.load(); + } + })); + + return; + } + toLoad.add(resource); } @@ -58,26 +78,6 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L if (!def.isLoaded()) { - // skip nulls - if (def instanceof NullResource) continue; - - // textures & fonts needs to be loaded in main thread - if (def.getClass().isAnnotationPresent(MustLoadInMainThread.class)) { - - Log.f3(" Delegating to main thread:\n " + Log.str(def)); - - app.getEventBus().send(new MainLoopTaskRequest(new Runnable() { - - @Override - public void run() - { - def.load(); - } - })); - - continue; - } - Log.f3(" Loading async:\n " + Log.str(def)); exs.submit(new Runnable() { diff --git a/src/mightypork/gamecore/loading/BaseDeferredResource.java b/src/mightypork/gamecore/loading/BaseDeferredResource.java index f8237a9..9040119 100644 --- a/src/mightypork/gamecore/loading/BaseDeferredResource.java +++ b/src/mightypork/gamecore/loading/BaseDeferredResource.java @@ -31,7 +31,8 @@ public abstract class BaseDeferredResource implements DeferredResource, Destroya { if (loadAttempted) { Log.w(" Already loaded @ load():\n " + this); - return; + (new IllegalStateException()).printStackTrace(); + //return; } loadAttempted = true; @@ -55,7 +56,7 @@ public abstract class BaseDeferredResource implements DeferredResource, Destroya @Override - public final boolean isLoaded() + public synchronized final boolean isLoaded() { if (isNull()) return false; @@ -76,6 +77,7 @@ public abstract class BaseDeferredResource implements DeferredResource, Destroya return true; } else { Log.w(" First use, not loaded yet - loading directly\n " + this); + (new IllegalStateException()).printStackTrace(); load(); } diff --git a/src/mightypork/gamecore/render/fonts/DeferredFont.java b/src/mightypork/gamecore/render/fonts/DeferredFont.java index aaaac9b..279fac9 100644 --- a/src/mightypork/gamecore/render/fonts/DeferredFont.java +++ b/src/mightypork/gamecore/render/fonts/DeferredFont.java @@ -87,7 +87,7 @@ public class DeferredFont extends BaseDeferredResource implements GLFont { @Override - protected final void loadResource(String path) throws FontFormatException, IOException + protected synchronized final void loadResource(String path) throws FontFormatException, IOException { final Font awtFont = getAwtFont(path, (float) size, style.numval); diff --git a/src/mightypork/gamecore/render/textures/DeferredTexture.java b/src/mightypork/gamecore/render/textures/DeferredTexture.java index edea76d..3342938 100644 --- a/src/mightypork/gamecore/render/textures/DeferredTexture.java +++ b/src/mightypork/gamecore/render/textures/DeferredTexture.java @@ -38,7 +38,7 @@ public class DeferredTexture extends BaseDeferredResource implements FilteredTex @Override - protected void loadResource(String path) + protected synchronized void loadResource(String path) { backingTexture = Render.loadTexture(path); } diff --git a/src/mightypork/utils/logging/LogInstance.java b/src/mightypork/utils/logging/LogInstance.java index 1b14492..1af6696 100644 --- a/src/mightypork/utils/logging/LogInstance.java +++ b/src/mightypork/utils/logging/LogInstance.java @@ -104,7 +104,7 @@ public class LogInstance { logger.setUseParentHandlers(false); logger.setLevel(Level.ALL); final String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()); - i("= Logger \"" + name + "\" initialized =\n" + stamp); + i("Logger \"" + name + "\" initialized.\n" + stamp); }