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;
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
import dev.latvian.kubejs.recipe.RecipeEventJS;
import dev.latvian.kubejs.recipe.RecipeJS;
import dev.latvian.kubejs.recipe.filter.RecipeFilter;
import org.embeddedt.modernfix.util.ModUtil;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
@ -25,7 +27,7 @@ public class RecipeEventJSMixin {
if (filter == RecipeFilter.ALWAYS_TRUE) {
this.originalRecipes.forEach(consumer);
} 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);
}
}

View File

@ -14,6 +14,8 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.embeddedt.modernfix.ModernFix;
import java.util.*;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinWorkerThread;
import java.util.function.Supplier;
public class ModUtil {
@ -49,4 +51,21 @@ public class ModUtil {
});
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
);
}