From 43ca13cdf2f306d5b6c5e9576731336e11189331 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 3 Oct 2023 13:45:18 -0400 Subject: [PATCH] Attempt to free leaked BufferBuilders --- .../BufferBuilderMixin.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java new file mode 100644 index 00000000..3a6e190b --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/buffer_builder_leak/BufferBuilderMixin.java @@ -0,0 +1,35 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.buffer_builder_leak; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import org.embeddedt.modernfix.ModernFix; +import org.lwjgl.system.MemoryUtil; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.nio.ByteBuffer; + +@Mixin(BufferBuilder.class) +public class BufferBuilderMixin { + @Shadow private ByteBuffer buffer; + + private static final MemoryUtil.MemoryAllocator ALLOCATOR = MemoryUtil.getAllocator(false); + private static boolean leakReported = false; + + @Override + protected void finalize() throws Throwable { + try { + ByteBuffer buf = buffer; + // can be null if a mod already tried to free the buffer + if(buf != null) { + if(!leakReported) { + leakReported = true; + ModernFix.LOGGER.warn("One or more BufferBuilders have been leaked, ModernFix will attempt to correct this."); + } + ALLOCATOR.free(MemoryUtil.memAddress0(buf)); + buffer = null; + } + } finally { + super.finalize(); + } + } +}