Skip to content

Commit ab8a806

Browse files
committed
Avoid synchronizing layer list in LivingEntityRenderer
1 parent 79d2b28 commit ab8a806

1 file changed

Lines changed: 21 additions & 15 deletions

File tree

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,34 @@
11
package org.embeddedt.modernfix.common.mixin.safety;
22

3+
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.model.EntityModel;
37
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
48
import net.minecraft.client.renderer.entity.layers.RenderLayer;
9+
import net.minecraft.world.entity.Entity;
10+
import org.embeddedt.modernfix.ModernFix;
511
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
6-
import org.spongepowered.asm.mixin.Final;
712
import org.spongepowered.asm.mixin.Mixin;
8-
import org.spongepowered.asm.mixin.Mutable;
913
import org.spongepowered.asm.mixin.Shadow;
10-
import org.spongepowered.asm.mixin.injection.At;
11-
import org.spongepowered.asm.mixin.injection.Inject;
12-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13-
14-
import java.util.Collections;
15-
import java.util.List;
1614

1715
@Mixin(LivingEntityRenderer.class)
1816
@ClientOnlyMixin
19-
public class LivingEntityRendererMixin {
20-
@Shadow @Final @Mutable
21-
protected List<RenderLayer<?, ?>> layers;
17+
public abstract class LivingEntityRendererMixin<T extends Entity, M extends EntityModel<T>> {
18+
@Shadow
19+
public abstract boolean addLayer(RenderLayer<T, M> layer);
2220

23-
@Inject(method = "<init>", at = @At("RETURN"))
24-
private void synchronizeLayerList(CallbackInfo ci) {
25-
/* allows buggy mods to call addLayer concurrently, order is not deterministic but can't fix that */
26-
this.layers = Collections.synchronizedList(layers);
21+
/**
22+
* @author embeddedt
23+
* @reason avoid CMEs from buggy mods calling addLayer on wrong thread
24+
*/
25+
@WrapMethod(method = "addLayer")
26+
private boolean handleOffThreadLayerAdd(RenderLayer<T, M> layer, Operation<Boolean> original) {
27+
if (!Minecraft.getInstance().isSameThread()) {
28+
ModernFix.LOGGER.error("LivingEntityRenderer.addLayer called on wrong thread", new Exception());
29+
Minecraft.getInstance().tell(() -> this.addLayer(layer));
30+
return true;
31+
}
32+
return original.call(layer);
2733
}
2834
}

0 commit comments

Comments
 (0)