From db34112229f2565b4d2662372e0cc98b05224b52 Mon Sep 17 00:00:00 2001 From: badlogic Date: Fri, 31 May 2013 02:18:58 +0200 Subject: [PATCH] fixed a super nasty bug in AssetManager, concurrency is hard :) --- .../com/badlogic/gdx/assets/AssetLoadingTask.java | 20 ++++++++------------ gdx/src/com/badlogic/gdx/assets/AssetManager.java | 8 +++++++- .../com/badlogic/gdx/assets/loaders/ModelLoader.java | 13 ++++++++++++- .../badlogic/gdx/assets/loaders/TextureLoader.java | 18 +----------------- .../com/badlogic/gdx/tests/g3d/ModelLoaderTest.java | 5 ++++- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/gdx/src/com/badlogic/gdx/assets/AssetLoadingTask.java b/gdx/src/com/badlogic/gdx/assets/AssetLoadingTask.java index ebdf9ab60..8fb6c2343 100644 --- a/gdx/src/com/badlogic/gdx/assets/AssetLoadingTask.java +++ b/gdx/src/com/badlogic/gdx/assets/AssetLoadingTask.java @@ -41,15 +41,15 @@ class AssetLoadingTask implements Callable { final long startTime; volatile boolean asyncDone = false; - boolean dependenciesLoaded = false; - Array dependencies; - Future depsFuture = null; + volatile boolean dependenciesLoaded = false; + volatile Array dependencies; + volatile Future depsFuture = null; - Future loadFuture = null; - Object asset = null; + volatile Future loadFuture = null; + volatile Object asset = null; int ticks = 0; - boolean cancel = false; + volatile boolean cancel = false; public AssetLoadingTask (AssetManager manager, AssetDescriptor assetDesc, AssetLoader loader, ExecutorService threadPool) { this.manager = manager; @@ -66,9 +66,7 @@ class AssetLoadingTask implements Callable { if (dependenciesLoaded == false) { dependencies = asyncLoader.getDependencies(assetDesc.fileName, assetDesc.params); if (dependencies != null) { - for (AssetDescriptor desc : dependencies) { - manager.injectDependency(assetDesc.fileName, desc); - } + manager.injectDependencies(assetDesc.fileName, dependencies); } else { // if we have no dependencies, we load the async part of the task immediately. asyncLoader.loadAsync(manager, assetDesc.fileName, assetDesc.params); @@ -105,9 +103,7 @@ class AssetLoadingTask implements Callable { asset = syncLoader.load(manager, assetDesc.fileName, assetDesc.params); return; } - for (AssetDescriptor desc : dependencies) { - manager.injectDependency(assetDesc.fileName, desc); - } + manager.injectDependencies(assetDesc.fileName, dependencies); } else { asset = syncLoader.load(manager, assetDesc.fileName, assetDesc.params); } diff --git a/gdx/src/com/badlogic/gdx/assets/AssetManager.java b/gdx/src/com/badlogic/gdx/assets/AssetManager.java index 4ae0a4e82..d697e29e6 100644 --- a/gdx/src/com/badlogic/gdx/assets/AssetManager.java +++ b/gdx/src/com/badlogic/gdx/assets/AssetManager.java @@ -369,7 +369,13 @@ public class AssetManager implements Disposable { log.debug("Loading complete."); } - synchronized void injectDependency (String parentAssetFilename, AssetDescriptor dependendAssetDesc) { + synchronized void injectDependencies(String parentAssetFilename, Array dependendAssetDescs) { + for(AssetDescriptor desc: dependendAssetDescs) { + injectDependency(parentAssetFilename, desc); + } + } + + private synchronized void injectDependency (String parentAssetFilename, AssetDescriptor dependendAssetDesc) { // add the asset as a dependency of the parent asset Array dependencies = assetDependencies.get(parentAssetFilename); if (dependencies == null) { diff --git a/gdx/src/com/badlogic/gdx/assets/loaders/ModelLoader.java b/gdx/src/com/badlogic/gdx/assets/loaders/ModelLoader.java index 53a3469df..eba7b5257 100644 --- a/gdx/src/com/badlogic/gdx/assets/loaders/ModelLoader.java +++ b/gdx/src/com/badlogic/gdx/assets/loaders/ModelLoader.java @@ -1,6 +1,7 @@ package com.badlogic.gdx.assets.loaders; -import com.badlogic.gdx.Gdx; +import java.util.Iterator; + import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetLoaderParameters; import com.badlogic.gdx.assets.AssetManager; @@ -12,6 +13,7 @@ import com.badlogic.gdx.graphics.g3d.model.data.ModelMaterial; import com.badlogic.gdx.graphics.g3d.model.data.ModelTexture; import com.badlogic.gdx.graphics.g3d.utils.TextureProvider; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.ObjectMap; public abstract class ModelLoader

> extends AsynchronousAssetLoader { @@ -91,6 +93,15 @@ public abstract class ModelLoader

> extend if (data == null) return null; final Model result = new Model(data, new TextureProvider.AssetTextureProvider(manager)); + // need to remove the textures from the managed disposables, or else ref counting + // doesn't work! + Iterator disposables = result.getManagedDisposables().iterator(); + while(disposables.hasNext()) { + Disposable disposable = disposables.next(); + if(disposable instanceof Texture) { + disposables.remove(); + } + } data = null; return result; } diff --git a/gdx/src/com/badlogic/gdx/assets/loaders/TextureLoader.java b/gdx/src/com/badlogic/gdx/assets/loaders/TextureLoader.java index 416215d39..77781a5bc 100644 --- a/gdx/src/com/badlogic/gdx/assets/loaders/TextureLoader.java +++ b/gdx/src/com/badlogic/gdx/assets/loaders/TextureLoader.java @@ -44,9 +44,7 @@ public class TextureLoader extends AsynchronousAssetLoader items = new Array(); + TextureLoaderInfo info = new TextureLoaderInfo(); public TextureLoader (FileHandleResolver resolver) { super(resolver); @@ -54,7 +52,6 @@ public class TextureLoader extends AsynchronousAssetLoader