Skip to content

Commit

Permalink
Load assets in parallel
Browse files Browse the repository at this point in the history
The getAssetAsynchronous method uses a thread pool so that requests to
load assets don't block networking threads etc.

It has been a single thread pool through the existing git history
but it is assumed that it is like this because it used to have a thread
and then was converted to use a single thread fixed thread pool.

Unfortunately having a single thread only means that if an asset load
callback indirectly loads another asset then this can deadlock
since the asset loader thread needs to be released before the load
request can start, which it can't because that thread is waiting for the
result of loading the new asset, thus it deadlocks if an AddOn includes
a JavaScript onInit script since it deadlocks waiting to load that
script.

Changing the thread pool so that the threads load in parallel is an
observable change that could cause problems,
but if the AddOn isn't already loaded the addonLoader's thread pool
loads it instead and that works fine,
so MapTool should be alright with addons and other assets loading in
parallel.
  • Loading branch information
fishface60 committed Jan 28, 2025
1 parent b02a6a5 commit 7f7ff1a
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/main/java/net/rptools/maptool/model/AssetManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ForkJoinPool;
import net.rptools.lib.FileUtil;
import net.rptools.lib.MD5Key;
import net.rptools.maptool.client.AppUtil;
Expand Down Expand Up @@ -90,7 +91,7 @@ public class AssetManager {
/** Used to load assets from storage */
private static AssetLoader assetLoader = new AssetLoader();

private static ExecutorService assetLoaderThreadPool = Executors.newFixedThreadPool(1);
private static ExecutorService assetLoaderThreadPool = ForkJoinPool.commonPool();
private static ExecutorService assetWriterThreadPool = Executors.newFixedThreadPool(1);

static {
Expand Down

0 comments on commit 7f7ff1a

Please sign in to comment.