Skip to content

Commit 6188f85

Browse files
authored
[Memory-opti:fix leak] fix forge's FakePlayerFactory leaking the world server (#867)
1 parent 6832167 commit 6188f85

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

src/main/java/com/mitchej123/hodgepodge/config/MemoryConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ public static class MemoryLeakFixes {
115115
@Config.DefaultBoolean(true)
116116
@Config.RequiresMcRestart
117117
public boolean fixBibliocraftTESRWorldLeak;
118+
119+
@Config.Comment("Fix forge's FakePlayerFactory leaking the world instance")
120+
@Config.DefaultBoolean(true)
121+
@Config.RequiresMcRestart
122+
public boolean fixForgePlayerFactoryLeak;
118123
}
119124

120125
public static class AllocationFixes {

src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,10 @@ public enum Mixins implements IMixins {
10351035
.addClientMixins("forge.MixinAdvancedModelLoader_CacheModels")
10361036
.setApplyIf(() -> MemoryConfig.allocs.cacheAdvancedModels)
10371037
.setPhase(Phase.EARLY)),
1038+
FIX_FORGE_PLAYER_LEAK(new MixinBuilder()
1039+
.addCommonMixins("memory.MixinFakePlayerFactory_FixLeak")
1040+
.setApplyIf(() -> MemoryConfig.leaks.fixForgePlayerFactoryLeak)
1041+
.setPhase(Phase.EARLY)),
10381042
// endregion
10391043

10401044
// region Ic2 adjustments
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.mitchej123.hodgepodge.mixins.early.memory;
2+
3+
import net.minecraft.world.WorldServer;
4+
import net.minecraftforge.common.util.FakePlayer;
5+
import net.minecraftforge.common.util.FakePlayerFactory;
6+
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Shadow;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
13+
@Mixin(value = FakePlayerFactory.class, remap = false)
14+
public class MixinFakePlayerFactory_FixLeak {
15+
16+
@Shadow
17+
private static FakePlayer MINECRAFT_PLAYER;
18+
19+
@Inject(method = "unloadWorld", at = @At("HEAD"))
20+
private static void clearMinecraftPlayer(WorldServer world, CallbackInfo ci) {
21+
if (MINECRAFT_PLAYER != null && MINECRAFT_PLAYER.worldObj == world) {
22+
MINECRAFT_PLAYER = null;
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)