Use a custom ForkJoinPool so that mod classes load correctly

This commit is contained in:
embeddedt 2023-02-20 10:23:46 -05:00
parent df7cd20e59
commit 5cd80ebd27
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 22 additions and 1 deletions

View File

@ -1,8 +1,10 @@
package org.embeddedt.modernfix.mixin.perf.kubejs; package org.embeddedt.modernfix.mixin.perf.kubejs;
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
import dev.latvian.kubejs.recipe.RecipeEventJS; import dev.latvian.kubejs.recipe.RecipeEventJS;
import dev.latvian.kubejs.recipe.RecipeJS; import dev.latvian.kubejs.recipe.RecipeJS;
import dev.latvian.kubejs.recipe.filter.RecipeFilter; import dev.latvian.kubejs.recipe.filter.RecipeFilter;
import org.embeddedt.modernfix.util.ModUtil;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Overwrite;
@ -25,7 +27,7 @@ public class RecipeEventJSMixin {
if (filter == RecipeFilter.ALWAYS_TRUE) { if (filter == RecipeFilter.ALWAYS_TRUE) {
this.originalRecipes.forEach(consumer); this.originalRecipes.forEach(consumer);
} else if (filter != RecipeFilter.ALWAYS_FALSE) { } else if (filter != RecipeFilter.ALWAYS_FALSE) {
List<RecipeJS> filtered = this.originalRecipes.parallelStream().filter(filter).collect(Collectors.toList()); List<RecipeJS> filtered = LamdbaExceptionUtils.uncheck(() -> ModUtil.commonPool.submit(() -> this.originalRecipes.parallelStream().filter(filter).collect(Collectors.toList())).get());
filtered.forEach(consumer); filtered.forEach(consumer);
} }
} }

View File

@ -14,6 +14,8 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.ModernFix;
import java.util.*; import java.util.*;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinWorkerThread;
import java.util.function.Supplier; import java.util.function.Supplier;
public class ModUtil { public class ModUtil {
@ -49,4 +51,21 @@ public class ModUtil {
}); });
return modsListening; return modsListening;
} }
private static final ClassLoader targetClassLoader = Thread.currentThread().getContextClassLoader();
private static class ModernFixForkJoinWorkerThread extends ForkJoinWorkerThread {
ModernFixForkJoinWorkerThread(ForkJoinPool pool) {
super(pool);
/* Ensure that the context class loader is set correctly */
this.setContextClassLoader(targetClassLoader);
}
}
public static ForkJoinPool commonPool = new ForkJoinPool(
ForkJoinPool.getCommonPoolParallelism(),
ModernFixForkJoinWorkerThread::new,
null,
false
);
} }