Move to global cleaner + enable tracking for all but memory buffers
This commit is contained in:
@@ -7,10 +7,10 @@ import me.cortex.voxy.common.world.SaveLoadSystem;
|
|||||||
|
|
||||||
import java.lang.ref.Cleaner;
|
import java.lang.ref.Cleaner;
|
||||||
|
|
||||||
|
import static me.cortex.voxy.common.util.GlobalCleaner.CLEANER;
|
||||||
import static org.lwjgl.util.zstd.Zstd.*;
|
import static org.lwjgl.util.zstd.Zstd.*;
|
||||||
|
|
||||||
public class ZSTDCompressor implements StorageCompressor {
|
public class ZSTDCompressor implements StorageCompressor {
|
||||||
private static final Cleaner CLEANER = Cleaner.create();
|
|
||||||
private record Ref(long ptr) {}
|
private record Ref(long ptr) {}
|
||||||
|
|
||||||
private static Ref createCleanableCompressionContext() {
|
private static Ref createCleanableCompressionContext() {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package me.cortex.voxy.common.util;
|
||||||
|
|
||||||
|
import java.lang.ref.Cleaner;
|
||||||
|
|
||||||
|
public class GlobalCleaner {
|
||||||
|
public static final Cleaner CLEANER = Cleaner.create();
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package me.cortex.voxy.common.util;
|
package me.cortex.voxy.common.util;
|
||||||
|
|
||||||
|
import me.cortex.voxy.commonImpl.VoxyCommon;
|
||||||
import org.lwjgl.system.MemoryUtil;
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -7,6 +8,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
public class MemoryBuffer extends TrackedObject {
|
public class MemoryBuffer extends TrackedObject {
|
||||||
|
private static final boolean TRACK_MEMORY_BUFFERS = VoxyCommon.isVerificationFlagOn("trackBuffers");
|
||||||
|
|
||||||
public final long address;
|
public final long address;
|
||||||
public final long size;
|
public final long size;
|
||||||
private final boolean freeable;
|
private final boolean freeable;
|
||||||
@@ -21,7 +24,7 @@ public class MemoryBuffer extends TrackedObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private MemoryBuffer(boolean track, long address, long size, boolean freeable) {
|
private MemoryBuffer(boolean track, long address, long size, boolean freeable) {
|
||||||
super(track);
|
super(track && TRACK_MEMORY_BUFFERS);
|
||||||
this.tracked = track;
|
this.tracked = track;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.address = address;
|
this.address = address;
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ package me.cortex.voxy.common.util;
|
|||||||
|
|
||||||
import java.lang.ref.Cleaner;
|
import java.lang.ref.Cleaner;
|
||||||
|
|
||||||
|
import static me.cortex.voxy.common.util.GlobalCleaner.CLEANER;
|
||||||
|
|
||||||
public class ThreadLocalMemoryBuffer {
|
public class ThreadLocalMemoryBuffer {
|
||||||
private static final Cleaner CLEANER = Cleaner.create();
|
|
||||||
private static MemoryBuffer createMemoryBuffer(long size) {
|
private static MemoryBuffer createMemoryBuffer(long size) {
|
||||||
var buffer = new MemoryBuffer(size);
|
var buffer = new MemoryBuffer(size);
|
||||||
var ref = MemoryBuffer.createUntrackedUnfreeableRawFrom(buffer.address, buffer.size);
|
var ref = MemoryBuffer.createUntrackedUnfreeableRawFrom(buffer.address, buffer.size);
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ import me.cortex.voxy.commonImpl.VoxyCommon;
|
|||||||
|
|
||||||
import java.lang.ref.Cleaner;
|
import java.lang.ref.Cleaner;
|
||||||
|
|
||||||
|
import static me.cortex.voxy.common.util.GlobalCleaner.CLEANER;
|
||||||
|
|
||||||
public abstract class TrackedObject {
|
public abstract class TrackedObject {
|
||||||
//TODO: maybe make this false? for performance overhead?
|
//TODO: maybe make this false? for performance overhead?
|
||||||
public static final boolean TRACK_OBJECT_ALLOCATIONS = VoxyCommon.isVerificationFlagOn("ensureTrackedObjectsAreFreed");
|
public static final boolean TRACK_OBJECT_ALLOCATIONS = VoxyCommon.isVerificationFlagOn("ensureTrackedObjectsAreFreed", true);
|
||||||
public static final boolean TRACK_OBJECT_ALLOCATION_STACKS = VoxyCommon.isVerificationFlagOn("trackObjectAllocationStacks");
|
public static final boolean TRACK_OBJECT_ALLOCATION_STACKS = VoxyCommon.isVerificationFlagOn("trackObjectAllocationStacks");
|
||||||
|
|
||||||
private final Ref ref;
|
private final Ref ref;
|
||||||
@@ -49,14 +51,6 @@ public abstract class TrackedObject {
|
|||||||
|
|
||||||
public record Ref(Cleaner.Cleanable cleanable, boolean[] freedRef) {}
|
public record Ref(Cleaner.Cleanable cleanable, boolean[] freedRef) {}
|
||||||
|
|
||||||
private static final Cleaner cleaner;
|
|
||||||
static {
|
|
||||||
if (TRACK_OBJECT_ALLOCATIONS) {
|
|
||||||
cleaner = Cleaner.create();
|
|
||||||
} else {
|
|
||||||
cleaner = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static Ref register(boolean track, Object obj) {
|
public static Ref register(boolean track, Object obj) {
|
||||||
boolean[] freed = new boolean[1];
|
boolean[] freed = new boolean[1];
|
||||||
Cleaner.Cleanable cleanable = null;
|
Cleaner.Cleanable cleanable = null;
|
||||||
@@ -69,7 +63,7 @@ public abstract class TrackedObject {
|
|||||||
} else {
|
} else {
|
||||||
trace = null;
|
trace = null;
|
||||||
}
|
}
|
||||||
cleanable = cleaner.register(obj, () -> {
|
cleanable = CLEANER.register(obj, () -> {
|
||||||
if (!freed[0]) {
|
if (!freed[0]) {
|
||||||
Logger.error("Object named: " + clazz + " was not freed, location at:\n", trace==null?"Enable allocation stack tracing":trace);
|
Logger.error("Object named: " + clazz + " was not freed, location at:\n", trace==null?"Enable allocation stack tracing":trace);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,11 @@ public class VoxyCommon implements ModInitializer {
|
|||||||
|
|
||||||
//This is hardcoded like this because people do not understand what they are doing
|
//This is hardcoded like this because people do not understand what they are doing
|
||||||
public static boolean isVerificationFlagOn(String name) {
|
public static boolean isVerificationFlagOn(String name) {
|
||||||
return System.getProperty("voxy."+name, "false").equals("true");
|
return isVerificationFlagOn(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isVerificationFlagOn(String name, boolean defaultOn) {
|
||||||
|
return System.getProperty("voxy."+name, defaultOn?"true":"false").equals("true");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void breakpoint() {
|
public static void breakpoint() {
|
||||||
|
|||||||
Reference in New Issue
Block a user